AWS EMR环境下运行Spark作业如何提升Executor数量
解决方法
优先级1:补全RDD分区配置
Spark动态分配的扩容逻辑完全依赖积压待调度的任务数量,你当前代码里parallelize方法未显式指定分区数,即便配置了spark.default.parallelism=128,如果总任务数少于单Executor可承载的任务上限,动态分配不会申请额外的Executor。
直接修改代码指定更高的分区数即可,建议设置为预期总核心数的2~3倍,你的集群总可用核心为32,可设为100:
val count = spark.sparkContext.parallelize(1 to 2147483647, 100).filter { _ => val x = math.random val y = math.random x*x + y*y < 1 }.count() println(s"Pi is roughly ${4.0 * count / 2147483647}")
优先级2:调整动态分配上限参数
你仅配置了最小Executor数,Spark默认spark.dynamicAllocation.maxExecutors参数值极低,部分EMR 6.x版本默认值仅为4,直接限制了Executor的最大数量。提交作业时补充以下配置:
--conf spark.dynamicAllocation.maxExecutors=8--conf spark.dynamicAllocation.schedulerBacklogTimeout=1s(调整扩容触发阈值,避免Executor申请延迟)
优先级3:配置YARN节点标签匹配
EMR默认会给任务节点打上专属YARN标签node-role.task,未显式配置的情况下Spark不会将作业调度到任务节点,只能用到核心节点资源。补充以下配置即可让Spark同时使用核心、任务节点的所有资源:
--conf spark.yarn.nodeLabelExpression=*
快速排查方案
如果需要快速定位问题根因,可临时关闭动态分配,手动指定Executor数量测试集群资源容量:spark-submit --conf spark.dynamicAllocation.enabled=false --conf spark.executor.instances=8 你的其他提交参数
如果该模式下可正常启动8个Executor,说明问题完全出在动态分配配置上,按前序步骤调整即可;如果仍无法启动,需要检查YARN队列的资源配额限制。
内容的提问来源于stack exchange,提问作者Guillaume
相关产品推荐
相关产品推荐

