一、YARN队列资源分配不均衡现象
最近在维护一个Hadoop集群时,发现有个奇怪的现象:明明配置了多个资源队列,但总有几个队列饿得嗷嗷叫,而另外几个队列却撑得走不动路。这就好比食堂开了10个打饭窗口,结果8个窗口没人排队,剩下2个窗口排了50米长队。
具体表现是:
- marketing队列的container等待时间超过2小时
- research队列的资源利用率长期低于10%
- 通过ResourceManager WebUI看到default队列占用80%资源
<!-- 典型的不公平配置示例(yarn-site.xml片段) -->
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>default,marketing,research</value> <!-- 定义了三个队列 -->
</property>
<property>
<name>yarn.scheduler.capacity.root.default.capacity</name>
<value>80</value> <!-- 问题所在:default队列独占80%资源 -->
</property>
二、问题排查三板斧
1. 检查队列配置
首先得掏出我们的"放大镜"——Capacity Scheduler配置。通过以下命令可以快速获取当前配置:
# 查看运行中的队列配置(技术栈:Hadoop Shell)
yarn rmadmin -getGroups research # 检查用户组映射
yarn queue -status all # 查看所有队列状态
常见配置陷阱包括:
- 队列capacity总和≠100%
- 最大容量(maximum-capacity)设置过低
- 用户/用户组权限分配不合理
2. 监控资源使用
用YARN自带的监控命令做个"体检":
# 实时监控命令示例(技术栈:Hadoop Shell)
yarn application -list # 查看运行中的应用
yarn node -list -all # 查看节点资源
yarn top # 类似Linux top的资源视图
重点关注指标:
- Pending Containers数量
- Reserved Containers数量
- 各队列的Used Capacity百分比
3. 日志分析
当发现research队列有资源但无法分配时,需要检查ResourceManager日志:
# 日志分析命令示例(技术栈:Hadoop Shell)
tail -n 500 /var/log/hadoop-yarn/resourcemanager.log | grep "research"
典型错误日志特征:
WARN org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.LeafQueue:
research queue is underutilized (current=5%, needed=20%)
三、解决方案实战
方案1:动态资源调配
给我们的队列装上"自动调节器":
<!-- 动态资源分配配置(yarn-site.xml) -->
<property>
<name>yarn.scheduler.capacity.root.research.auto-queue-creation.enabled</name>
<value>true</value> <!-- 允许自动创建子队列 -->
</property>
<property>
<name>yarn.scheduler.capacity.root.marketing.ordering-policy</name>
<value>fair</value> <!-- 使用公平排序策略 -->
</property>
方案2:权重调整
像调鸡尾酒一样调配队列权重:
# 动态修改队列配置(技术栈:YARN API)
yarn rmadmin -updateQueue --updateInfo \
'{
"queueName":"root.default",
"capacity":40,
"maximumCapacity":60
}'
方案3:用户限制
防止"饿狼式"资源占用:
<!-- 用户限制配置(capacity-scheduler.xml) -->
<property>
<name>yarn.scheduler.capacity.root.marketing.user-limit-factor</name>
<value>2</value> <!-- 单个用户最多使用2倍最小资源 -->
</property>
<property>
<name>yarn.scheduler.capacity.root.research.minimum-user-limit-percent</name>
<value>50</value> <!-- 确保至少50%用户能获得资源 -->
</property>
四、进阶优化技巧
1. 基于标签的调度
像快递分拣一样分配资源:
# 节点标签配置示例(技术栈:Hadoop Shell)
yarn rmadmin -addToClusterNodeLabels "GPU" # 创建GPU标签
yarn rmadmin -replaceLabelsOnNode "node1:8088=GPU" # 给节点打标签
然后在队列配置中指定:
<property>
<name>yarn.scheduler.capacity.root.research.accessible-node-labels</name>
<value>GPU</value>
</property>
2. 预emption配置
设置"资源回收"机制:
<!-- 抢占配置(yarn-site.xml) -->
<property>
<name>yarn.scheduler.monitor.enable</name>
<value>true</value> <!-- 启用监控 -->
</property>
<property>
<name>yarn.scheduler.capacity.preemption.max-wait-before-kill</name>
<value>30000</value> <!-- 30秒等待时间 -->
</property>
五、避坑指南
容量规划黄金法则:
- 生产队列capacity建议50-70%
- 测试队列20-30%
- 保留10-20%缓冲
最大容量陷阱:
<!-- 错误示范 --> <property> <name>yarn.scheduler.capacity.root.marketing.maximum-capacity</name> <value>50</value> <!-- 如果capacity是60,这里就会冲突 --> </property>用户组映射检查:
# 检查用户组映射(技术栈:Hadoop Shell) yarn rmadmin -getGroups marketing_team
六、效果验证
优化后可以通过以下方式验证:
# 查看队列状态(技术栈:Hadoop Shell)
yarn queue -stats research
预期输出示例:
Queue Name : research
State : RUNNING
Capacity : 30.0% <!-- 达到预期配置 -->
Used : 28.5% <!-- 资源利用率提升 -->
Pending : 3 <!-- 等待任务显著减少 -->
评论