我正在使用spark-sql-2.4.1,spark-cassandra-connector_2.11-2.4.1与java8和apache cassandra 3.0版本。
我有我的火花提交或火花集群环境,如下所示,用于加载 20 亿条记录。
--executor-cores 3
--executor-memory 9g
--num-executors 5
--driver-cores 2
--driver-memory 4g
使用以下配置
cassandra.concurrent.writes=1500
cassandra.output.batch.size.rows=10
cassandra.output.batch.size.bytes=2048
cassandra.output.batch.grouping.key=partition
cassandra.output.consistency.level=LOCAL_QUORUM
cassandra.output.batch.grouping.buffer.size=3000
cassandra.output.throughput_mb_per_sec=128
工作大约需要 2 小时,时间真的很长
当我检查日志时,我看到 WARN com.datastax.spark.connector.writer.QueryExecutor - BusyPoolException
如何解决这个问题?
cassandra.concurrent.writes
的值不正确 - 这意味着您同时发送 1500 个并发批处理。但默认情况下,Java 驱动程序允许 1024 个并发请求。 通常,如果此参数的数字太大,可能会导致节点过载,从而导致任务重试。
此外,其他设置不正确 - 如果您将cassandra.output.batch.size.rows
,则其值将覆盖cassandra.output.batch.size.bytes
的值。有关更多详细信息,请参阅 Spark Cassandra 连接器参考的相应部分。
性能调优的一个方面是拥有正确数量的 Spark 分区,这样您就可以达到良好的并行性 - 但这实际上取决于您的代码、Cassandra 集群中的节点数量等。
附言另外,请注意,配置参数应以spark.cassandra.
开头,而不是以简单的cassandra.
开头 - 如果您在此表单中指定了它们,则忽略这些参数并使用默认值。