如何提升AWS EMR上Spark任务处理的并行度与运行性能
Spark on AWS EMR 并行度优化配置方案
一、资源分配类配置调整
当前集群总核数945,单executor配置5核,理论可同时运行最多189个executor,并行度不足首先排查资源分配限制:
- 检查静态executor配置参数
spark.executor.instances,如果该值被误设为1,直接调整为180左右即可(预留少量核给集群基础服务)。 - 若使用动态资源分配,确认已开启并配置合理的上下限:
spark.dynamicAllocation.enabled true spark.dynamicAllocation.minExecutors 2 spark.dynamicAllocation.maxExecutors 180 spark.dynamicAllocation.executorIdleTimeout 60s
- 同步调整driver侧资源,避免调度卡顿:设置
spark.driver.cores 4、spark.driver.memory 8g,适配大规模集群的任务调度需求。
二、任务并行度类配置调整
资源足够的情况下并行度仍低,大概率是任务分片配置不合理:
- 常规RDD作业调整
spark.default.parallelism,建议设置为集群总可用核数的2~3倍,当前场景下配置为1900左右即可。 - Spark SQL作业调整
spark.sql.shuffle.partitions,默认值为200,适配当前集群规模可调整到1800~2800之间,解决shuffle阶段并行度不足的问题。
三、作业逻辑与数据源校验
- 检查代码中是否存在
repartition(1)、coalesce(1)这类强制降并行度的操作,这类逻辑会强制所有数据落到1个分区,无论集群资源多少都只能单任务运行。 - 确认输入数据源是否为单个不可拆分的大文件(比如未分片的GZIP压缩文件),这类文件Spark只能启动1个任务读取,后续所有计算阶段都会被拖慢,建议提前拆分为多个可拆分格式的文件,比如Parquet、ORC或者未压缩的文本文件。
四、EMR集群侧配置校验
- 检查YARN队列的资源配额限制,确认你提交作业的队列没有设置资源上限,导致只能申请到1个executor的资源,如有需要联系集群管理员调整队列配额。
- 确认集群没有开启CPU绑定、单节点executor数量限制之类的特殊调度策略,无特殊需求用EMR默认的YARN调度策略即可。
内容的提问来源于stack exchange,提问作者Exorcismus
相关产品推荐
相关产品推荐

