使用Spark连接器向Amazon Keyspaces写入数据触发WriteTimeoutException错误
问题现象
使用Spark连接器向AWS Keyspaces写入数据时触发写入失败,具体报错如下:
ERROR QueryExecutor: Failed to execute: com.datastax.spark.connector.writer.RichBoundStatementWrapper@681c47f5 com.datastax.oss.driver.api.core.servererrors.WriteTimeoutException: Cassandra timeout during SIMPLE write query at consistency LOCAL_QUORUM (2 replica were required but only 0 acknowledged the write)
运行环境信息
- Spark版本:3.1
- EMR版本:6.3.1
- Cassandra版本:3.11.2
解决方案
- 调整写入一致性级别:AWS Keyspaces支持
LOCAL_ONE作为写入一致性级别,对一致性要求不高的场景下可大幅降低超时概率,在Spark配置中添加参数spark.cassandra.output.consistency.level=LOCAL_ONE - 限制写入批次大小:AWS Keyspaces单写入批次默认最大为1MB、单批次最多包含30行数据,添加配置限制批次大小避免请求超限:
spark.cassandra.output.batch.size.rows=20、spark.cassandra.output.batch.size.bytes=102400 - 校验容量配置:确认目标Keyspaces表的写入容量单元(WCU)配置充足,预置容量模式下可临时调高WCU阈值验证是否为容量不足导致的超时,按需容量模式下可等待冷启动预热完成后重试
- 优化重试策略:启用幂等重试适配网络波动场景,添加配置
spark.cassandra.retryPolicy=DefaultRetryPolicy、spark.cassandra.output.ignoreNulls=true - 排查分区热点:确认表分区键设计合理,避免单分区短时间内写入流量超过Keyspaces单分区每秒1000次写入的默认限制
- 验证网络连通性:确认EMR集群到Keyspaces的9142端口连通正常,安全组、网络ACL没有拦截对应流量
- 延长超时阈值:适当调高连接和写入超时时间,添加配置
spark.cassandra.connection.timeoutMS=12000、spark.cassandra.read.timeoutMS=12000
内容的提问来源于stack exchange,提问作者Alan Miranda
相关产品推荐
相关产品推荐

