获取 BusyPoolException com.datastax.spark.connector.writer.QueryExecutor ,我做错了什么?
Getting BusyPoolException com.datastax.spark.connector.writer.QueryExecutor , what wrong me doing?
我正在使用 spark-sql-2.4.1 ,spark-cassandra-connector_2.11-2.4.1 java8 和 apache cassandra 3.0 版本。
我有如下所示的 spark-submit 或 spark 集群环境来加载 20 亿条记录。
--executor-cores 3
--executor-memory 9g
--num-executors 5
--driver-cores 2
--driver-memory 4g
Using following configurration
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 小时,时间真的很长
当我检查日志时,我看到
警告 com.datastax.spark.connector.writer.QueryExecutor - BusyPoolException
如何解决这个问题?
您的 cassandra.concurrent.writes
值不正确 - 这意味着您同时发送 1500 个并发批次。但默认情况下,Java driver allows 1024 simultaneous requests。通常,如果此参数的数字太大,可能会导致节点过载,结果 - 重试任务。
此外,其他设置不正确 - 如果您选择 cassandra.output.batch.size.rows
,则其值将覆盖 cassandra.output.batch.size.bytes
的值。有关详细信息,请参阅 corresponding section of the Spark Cassandra Connector reference。
性能调优的一个方面是拥有正确数量的 Spark 分区,从而达到良好的并行性 - 但这实际上取决于您的代码、Cassandra 集群中的节点数量等。
P.S。另外,请注意配置参数应该以 spark.cassandra.
开头,而不是简单的 cassandra.
- 如果您以这种形式指定它们,那么这些参数将被忽略并使用默认值。
我正在使用 spark-sql-2.4.1 ,spark-cassandra-connector_2.11-2.4.1 java8 和 apache cassandra 3.0 版本。
我有如下所示的 spark-submit 或 spark 集群环境来加载 20 亿条记录。
--executor-cores 3
--executor-memory 9g
--num-executors 5
--driver-cores 2
--driver-memory 4g
Using following configurration
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 小时,时间真的很长
当我检查日志时,我看到 警告 com.datastax.spark.connector.writer.QueryExecutor - BusyPoolException
如何解决这个问题?
您的 cassandra.concurrent.writes
值不正确 - 这意味着您同时发送 1500 个并发批次。但默认情况下,Java driver allows 1024 simultaneous requests。通常,如果此参数的数字太大,可能会导致节点过载,结果 - 重试任务。
此外,其他设置不正确 - 如果您选择 cassandra.output.batch.size.rows
,则其值将覆盖 cassandra.output.batch.size.bytes
的值。有关详细信息,请参阅 corresponding section of the Spark Cassandra Connector reference。
性能调优的一个方面是拥有正确数量的 Spark 分区,从而达到良好的并行性 - 但这实际上取决于您的代码、Cassandra 集群中的节点数量等。
P.S。另外,请注意配置参数应该以 spark.cassandra.
开头,而不是简单的 cassandra.
- 如果您以这种形式指定它们,那么这些参数将被忽略并使用默认值。