一、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>

五、避坑指南

  1. 容量规划黄金法则:

    • 生产队列capacity建议50-70%
    • 测试队列20-30%
    • 保留10-20%缓冲
  2. 最大容量陷阱:

    <!-- 错误示范 -->
    <property>
      <name>yarn.scheduler.capacity.root.marketing.maximum-capacity</name>
      <value>50</value>  <!-- 如果capacity是60,这里就会冲突 -->
    </property>
    
  3. 用户组映射检查:

    # 检查用户组映射(技术栈: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        <!-- 等待任务显著减少 -->