You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark提交到Yarn时容器集中调度导致节点负载不均问题求解

问题根因

你遇到的是Yarn默认的容器贪心分配策略导致的节点负载不均衡问题,你之前调整的均为Spark侧调度、本地化参数,不影响Yarn的资源分配逻辑,所以不会生效。

解决方案

一、Yarn侧核心配置调整(需重启Yarn集群生效)

如果集群当前使用FairScheduler公平调度器,在yarn-site.xml中修改如下配置:

<!-- 关闭单节点多容器批量分配,避免单节点一次性分配过多容器 -->
<property>
  <name>yarn.resourcemanager.scheduler.fair.assignmultiple</name>
  <value>false</value>
</property>
<property>
  <name>yarn.resourcemanager.scheduler.fair.max.assign</name>
  <value>1</value>
</property>

如果集群当前使用默认的CapacityScheduler容量调度器,修改如下配置:

<!-- 启用主资源计算,同时考虑CPU、内存资源分配 -->
<property>
  <name>yarn.scheduler.capacity.resource-calculator</name>
  <value>org.apache.hadoop.yarn.util.resource.DominantResourceCalculator</value>
</property>
<!-- 单节点每次心跳最多分配1个容器,避免资源堆叠 -->
<property>
  <name>yarn.scheduler.capacity.per-node-heartbeat.maximum-container-assignments</name>
  <value>1</value>
</property>
<property>
  <name>yarn.scheduler.capacity.node-locality-delay</name>
  <value>0</value>
</property>

二、Spark侧补充配置(提交作业时添加,无需重启集群)

保留你已经配置的参数,额外添加以下参数即可:

  • 限制单节点可分配给当前作业的最大Executor数量,可根据作业总Executor数调整,比如总Executor数为40的话可设为2
    --conf spark.yarn.max.executors.per.node=2
    
  • 关闭Executor滚动启动策略,避免资源请求集中在少数节点
    --conf spark.yarn.executor.launch.spreadout.time=0
    
  • 如果开启了动态资源分配,额外添加:
    --conf spark.dynamicAllocation.executorIdleTimeout=60s
    --conf spark.dynamicAllocation.sustainedSchedulerBacklogTimeout=5s
    

验证方式

调整后提交作业,查看Yarn ResourceManager UI的容器分配节点分布,确认容器是否均匀分配到20个节点上。

内容的提问来源于stack exchange,提问作者Younes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 13:24:00