Spark写入Amazon Keyspaces表报错:无可用连接点 cqlsh可正常连接
问题原因排查及解决方案
核心报错原因
- 缺少AWS Keyspaces必填的本地数据中心配置:Spark Cassandra Connector的
LocalNodeFirstLoadBalancingPolicy需要明确指定数据中心名称,AWS Keyspaces的单区域数据中心名称和区域编码完全一致,你当前使用的是sa-east-1区域,未配置该参数会导致负载均衡策略识别不到可用节点,触发无可用contact points报错。 - 缺少分区器兼容配置:AWS Keyspaces使用自研的
com.amazonaws.cassandra.DefaultPartitioner,未做兼容配置时会触发分区器不支持的警告,还会导致token感知路由失效,进一步影响节点发现。 - 提交参数语法错误:你提供的spark-submit命令中,
spark.cassandra.connection.ssl.trustStore.path配置行末尾缺失续行符\,会导致下一行的trustStore密码配置未被加载,SSL认证失败也会导致节点连接失败。 - YARN集群模式下truststore文件未分发:cluster模式下任务运行在YARN的工作节点上,若仅在提交节点存放truststore文件,其余节点无法读取该文件会导致SSL握手失败。
修复配置
替换原有spark-submit配置即可正常运行:
spark-submit --deploy-mode cluster --master yarn \ # 上传truststore文件到YARN集群所有容器的工作目录 --files cassandra_truststore.jks \ --conf=spark.cassandra.connection.port="9142" \ --conf=spark.cassandra.connection.host="cassandra.sa-east-1.amazonaws.com" \ --conf=spark.cassandra.auth.username="BUU" \ --conf=spark.cassandra.auth.password="123456789" \ --conf=spark.cassandra.connection.ssl.enabled="true" \ --conf=spark.cassandra.connection.ssl.trustStore.path="cassandra_truststore.jks" \ --conf=spark.cassandra.connection.ssl.trustStore.password="123456" \ # 新增必填的本地DC配置,值对应你的Keyspaces区域 --conf=spark.cassandra.connection.local_dc="sa-east-1" \ # 新增分区器兼容配置 --conf=spark.cassandra.partitioner.class="com.amazonaws.cassandra.DefaultPartitioner" \ # Keyspaces要求读写一致性等级为LOCAL_QUORUM --conf=spark.cassandra.output.consistency.level="LOCAL_QUORUM" \ --conf=spark.cassandra.input.consistency.level="LOCAL_QUORUM"
内容的提问来源于stack exchange,提问作者Alan Miranda
相关产品推荐
相关产品推荐

