Apache spark 获取busypool异常com.datastax.spark.connector.writer.QueryExecutor,我做错了什么?
我正在使用spark-sql-2.4.1、spark-cassandra-connector_2.11-2.4.1以及java8和apache cassandra 3.0版本 我的spark submit或spark cluster环境如下,可加载20亿条记录Apache spark 获取busypool异常com.datastax.spark.connector.writer.QueryExecutor,我做错了什么?,apache-spark,cassandra,apache-spark-sql,datastax-java-driver,spark-cassandra-connector,Apache Spark,Cassandra,Apache Spark Sql,Datastax Java Driver,Spark Cassandra Connector,我正在使用spark-sql-2.4.1、spark-cassandra-connector_2.11-2.4.1以及java8和apache cassandra 3.0版本 我的spark submit或spark cluster环境如下,可加载20亿条记录 --executor-cores 3 --executor-memory 9g --num-executors 5 --driver-cores 2 --driver-memory 4g 使用以下配置 这项工作大约需要2个小时
--executor-cores 3
--executor-memory 9g
--num-executors 5
--driver-cores 2
--driver-memory 4g
使用以下配置
这项工作大约需要2个小时,时间实在太长了
当我查看日志时,我看到
警告com.datastax.spark.connector.writer.QueryExecutor-BusyPool异常
如何解决此问题?您的cassandra.concurrent.writes值不正确-这意味着您同时发送1500个并发批。但默认情况下。通常,若此参数的数值太大,可能会导致节点过载,并导致任务重试 此外,其他设置也不正确-如果指定cassandra.output.batch.size.rows,则其值将覆盖cassandra.output.batch.size.bytes的值。有关更多详细信息,请参阅 性能调优的一个方面是要有正确数量的Spark分区,这样才能达到良好的并行性——但这实际上取决于您的代码、Cassandra集群中有多少节点,等等
另外,请注意,配置参数应以spark.cassandra.开始,而不是简单的cassandra.-如果您在此表单中指定了分区键,那么这些参数将被忽略,并使用默认值。@BdLearner分区键的选择应基于用于从Cassandra获取数据的访问模式-这实际上取决于您的用例,通常很难说。我建议学习DS220课程-这里有一些关于如何正确设计分区键的示例
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