EMR Spark作业未充分利用集群节点的问题排查与解决
解决Spark集群未充分利用所有节点的问题
这问题我之前帮不少同学排查过,咱们一步步拆解原因和对应的解决办法:
一、先搞清楚默认配置的坑
Spark在集群模式(尤其是YARN)下,默认不会自动填满所有节点的资源——它会根据集群的可用资源、作业的默认并行度来动态调整executor数量,这就导致你3个工作节点只用到了2个。核心问题在于默认的executor资源配置没有匹配你的m4.large节点规格,以及作业的并行度不足以驱动所有节点。
二、提交作业时指定关键配置参数
针对你的m4.large节点(2vCPU、8GB内存),在spark-submit里添加以下参数,确保每个工作节点都能分配到executor:
1. 强制指定executor数量
直接设置和工作节点数一致的executor数量,确保每个节点至少有1个executor:
--num-executors 3
2. 匹配节点规格设置executor资源
m4.large总内存8GB,留2GB给节点系统进程;CPU有2核,留1核给系统,所以每个executor的配置可以这样:
--executor-memory 6g --executor-cores 1
如果想最大化单节点资源,也可以设置--executor-cores 2,但要确保--num-executors 3(每个节点1个executor,占满所有核)。
3. 关闭动态资源分配(可选但有效)
默认的动态分配可能因为作业初期资源需求低,不会启动所有executor,关闭它强制固定数量:
--conf spark.dynamicAllocation.enabled=false
4. 提升作业并行度
如果作业的任务数太少,就算有3个executor,也会有节点闲下来。设置默认并行度,确保任务数足够分配:
--conf spark.default.parallelism=12 # 比如每个executor处理4个任务,3*4=12
或者在代码里对RDD/DataFrame设置分区数(比如df.repartition(12))。
三、检查YARN集群的基础配置
如果上面的参数加了还是不行,得确认YARN的节点资源配置是否正确:
- 每个NodeManager的
yarn.nodemanager.resource.memory-mb要设为8192(对应8GB) yarn.nodemanager.resource.cpu-vcores设为2(对应m4.large的2核)
这些配置在yarn-site.xml里修改,修改后重启NodeManager。
四、验证效果
提交作业后,去Spark UI的Executors页面:
- 检查executor数量是否为3,且每个executor的Host对应你的3个工作节点
- 看Jobs页面的任务分布,确认每个executor都有任务在运行
同时看Ganglia的节点负载,确保3个工作节点的CPU、内存都有被使用。
内容的提问来源于stack exchange,提问作者osk
相关产品推荐
相关产品推荐

