Delta Lake OPTIMIZE命令未充分利用节点,如何提升并行度?
解决Delta Lake OPTIMIZE命令并行度不足的问题
环境配置
- AWS EMR 6.10
- 100台r5d.4xlarge节点
- Spark 3.3.1
- Delta Lake 2.2.0
当前配置与执行命令
Spark提交参数
--num-executors 100 --executor-memory 64g --conf spark.executor.memoryOverhead=54g --executor-cores 15 --conf spark.default.parallelism=1500
OPTIMIZE执行命令
OPTIMIZE delta.`<path>` WHERE partition_by_hour_column between <...> and <...>
问题
集群配备100个executor,但OPTIMIZE作业的并行任务数始终维持在14-15左右,远低于预期,需提升至至少每个executor对应一个并行任务。
解决方案
1. 调整Delta Optimize并行度控制参数
Delta Lake的OPTIMIZE命令默认由spark.databricks.delta.optimize.maxThreads参数限制最大并行任务数,默认值为15,这正是当前并行度偏低的直接原因。
在Spark提交命令中添加以下配置,将并行数调整为与executor数量匹配:
--conf spark.databricks.delta.optimize.maxThreads=100
若想进一步利用executor的多核能力,可基于总核心数(100*15=1500)设置更高值,同时注意集群负载:
--conf spark.databricks.delta.optimize.maxThreads=300
2. 检查分区与文件分布情况
若调整上述参数后并行度仍未提升,需确认两点:
- 分区数量:
WHERE子句选中的partition_by_hour_column分区数量如果过少(比如仅15个),会直接限制并行任务生成数。可扩大分区范围,确保有足够多的分区供并行处理。 - 文件大小阈值:若分区内文件普遍远大于默认128MB的合并阈值,每个任务会处理大量数据,导致并行任务数减少。可调整最小合并文件大小,让更多小文件参与合并,生成更多并行任务:
--conf spark.databricks.delta.optimize.minFileSize=64MB
3. 确认Spark资源配置合理性
当前executor配置(100个executor,每个15核)总核心数为1500,与spark.default.parallelism=1500匹配,需确保:
spark.task.cpus保持默认值1,保证每个executor可同时运行15个任务。- 集群无资源抢占:确认EMR集群没有其他作业占用资源,导致当前OPTIMIZE作业无法获取足够executor资源。
验证方法
修改配置后重新提交OPTIMIZE作业,在Spark UI的Jobs页面查看任务并行数,或在SQL页面查看OPTIMIZE对应的任务执行情况,确认并行度是否提升。
内容的提问来源于stack exchange,提问作者Alexander Pavlov
相关产品推荐
相关产品推荐

