Spark并行度spark.default.parallelism与Elasticsearch scroll切片的关联问题
关联逻辑
elasticsearch-hadoop 连接器读取 ES 数据时,默认会根据 Spark 的 spark.default.parallelism 配置值计算 ES scroll 切片数,你遇到的报错已明确验证了对应规则:
- 当
spark.default.parallelism设为8000时,计算出的切片数为2666;设为4000时,切片数为1333,对应系数为3,即切片数 = spark.default.parallelism / 3 - 每个 ES scroll 切片对应一个 Spark 读取任务,ES 索引默认限制单个 scroll 请求的最大切片数为1024,由参数
index.max_slices_per_scroll控制,当计算出的切片数超过该阈值时就会触发报错。 - 额外说明:你当前 ES 集群只有9个分片,切片数超过分片数后不会再提升读取性能,反而会增加 ES 集群的调度开销,上千的并行度配置完全冗余。
解决方案
可按需选择以下任意方案解决报错:
- 方案一:降低 Spark 并行度。将
spark.default.parallelism调整到3072以下(3072/3刚好等于ES默认的1024切片上限),建议结合ES分片数配置为9的整数倍(比如27、36)即可,过高的并行度不会带来性能收益,还会增加任务调度开销。 - 方案二:调整 ES 索引切片上限。如果确实需要更高的并行度,可修改对应索引的配置,调高最大切片数限制,执行命令如下:
PUT /<你的索引名称>/_settings { "index.max_slices_per_scroll": 2048 }
注意:该值不建议设置过高,超过分片数的部分无实际性能收益,还会升高 ES 内存占用,有触发OOM的风险。
- 方案三:手动控制分区大小。可以在 Spark 作业配置中添加
es.input.max.docs.per.partition参数,指定每个 Spark 分区读取的最大文档数,让连接器不再依赖spark.default.parallelism计算切片数,从根源避免切片数超标,例如配置为es.input.max.docs.per.partition=100000,连接器会根据索引总文档数自动计算合理的切片数。
内容的提问来源于stack exchange,提问作者mskanyal
相关产品推荐
相关产品推荐

