我使用的是spark-sql-2.4.1、spark-cassandra-connector 2.11-2.4.1以及java8和apache cassandra 3.0版本。
我有我的spark提交或spark集群环境,可以加载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
如何解决这个问题?
1条答案
按热度按时间bcs8qyzn1#
您的值不正确
cassandra.concurrent.writes
-这意味着您要同时发送1500个并发批处理。但默认情况下,java驱动程序允许1024个同时请求。通常,如果此参数的值太高,可能会导致节点过载,从而导致任务重试。另外,其他设置也不正确-如果您指定
cassandra.output.batch.size.rows
,则其值将覆盖cassandra.output.batch.size.bytes
. 有关更多详细信息,请参阅spark cassandra连接器参考的相应部分。性能调优的一个方面是拥有正确数量的spark分区,这样就可以获得良好的并行性——但这实际上取决于您的代码、cassandra集群中有多少节点等。
p、 另外,请注意,配置参数应该从
spark.cassandra.
,不是简单的cassandra.
-如果在此窗体中指定了这些参数,则将忽略这些参数并使用默认值。