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
相关产品推荐
相关产品推荐

