Get BusyPoolException com.datastax.spark.connector.writer.Qu



我正在使用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.开头 - 如果您在此表单中指定了它们,则忽略这些参数并使用默认值。

最新更新