YARN 调度器
YARN 调度器负责将集群资源分配给各个应用程序。本章将介绍 YARN 支持的三种调度器及其配置方法。
调度器概述
调度器的角色
在 YARN 架构中,调度器是 ResourceManager 的核心组件:
- 纯调度器:只负责资源分配,不负责应用监控
- 资源抽象:以 Container 为单位分配资源
- 可插拔设计:支持多种调度策略
三种调度器
| 调度器 | 特点 | 适用场景 |
|---|---|---|
| FIFO | 先进先出,简单 | 单用户、小集群 |
| Capacity | 多队列、容量保证 | 多用户、企业环境 |
| Fair | 公平分配、资源抢占 | 多用户、交互式应用 |
FIFO 调度器
工作原理
FIFO(First In First Out)调度器是最简单的调度策略:
特点:
- 应用按提交顺序排队
- 前一个应用完成后才执行下一个
- 简单但效率低
配置方法
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fifo.FifoScheduler</value>
</property>
优缺点
优点:
- 配置简单
- 无需了解应用优先级
缺点:
- 不支持多用户共享集群
- 大应用会阻塞小应用
- 资源利用率低
Capacity 调度器
工作原理
Capacity 调度器将集群资源划分为多个队列,每个队列有保证的资源配额:
核心概念:
| 概念 | 说明 |
|---|---|
| 队列容量 | 队列保证的资源百分比 |
| 最大容量 | 队列可使用的最大资源百分比 |
| 弹性资源 | 其他队列空闲时可借用的资源 |
队列层级结构
Capacity 调度器支持多层级队列:
root
├── prod(生产队列)
│ ├── web
│ └── batch
├── dev(开发队列)
│ ├── team-a
│ └── team-b
└── test(测试队列)
配置方法
启用 Capacity 调度器
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
队列配置(capacity-scheduler.xml)
<configuration>
<!-- 定义顶级队列 -->
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>prod,dev,test</value>
</property>
<!-- prod 队列配置 -->
<property>
<name>yarn.scheduler.capacity.root.prod.capacity</name>
<value>40</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.prod.maximum-capacity</name>
<value>60</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.prod.state</name>
<value>RUNNING</value>
</property>
<!-- dev 队列配置 -->
<property>
<name>yarn.scheduler.capacity.root.dev.capacity</name>
<value>40</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.maximum-capacity</name>
<value>80</value>
</property>
<!-- dev 子队列 -->
<property>
<name>yarn.scheduler.capacity.root.dev.queues</name>
<value>team-a,team-b</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.team-a.capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.team-b.capacity</name>
<value>50</value>
</property>
<!-- test 队列配置 -->
<property>
<name>yarn.scheduler.capacity.root.test.capacity</name>
<value>20</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.test.maximum-capacity</name>
<value>30</value>
</property>
<!-- 用户限制 -->
<property>
<name>yarn.scheduler.capacity.root.prod.minimum-user-limit-percent</name>
<value>20</value>
</property>
<!-- 用户最大资源比例 -->
<property>
<name>yarn.scheduler.capacity.root.prod.user-limit-factor</name>
<value>2.0</value>
</property>
</configuration>
队列属性详解
| 属性 | 说明 |
|---|---|
capacity | 队列容量百分比 |
maximum-capacity | 队列最大容量百分比 |
state | 队列状态(RUNNING/STOPPED) |
acl_submit_applications | 提交应用权限 |
acl_administer_queue | 管理队列权限 |
minimum-user-limit-percent | 单用户最小资源比例 |
user-limit-factor | 单用户最大资源倍数 |
提交应用到指定队列
# 通过命令行指定队列
hadoop jar myapp.jar MyJob -D mapreduce.job.queuename=prod
# 在代码中指定队列
Configuration conf = new Configuration();
conf.set("mapreduce.job.queuename", "prod");
Fair 调度器
工作原理
Fair 调度器让所有应用公平地获得资源:
核心特点:
- 应用公平共享资源
- 支持资源抢占
- 支持多队列
配置方法
启用 Fair 调度器
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>
队列配置(fair-scheduler.xml)
<?xml version="1.0"?>
<allocations>
<!-- 全局配置 -->
<defaultQueueSchedulingPolicy>fair</defaultQueueSchedulingPolicy>
<!-- 队列配置 -->
<queue name="prod">
<minResources>8192 mb, 4 vcores</minResources>
<maxResources>16384 mb, 8 vcores</maxResources>
<maxRunningApps>10</maxRunningApps>
<weight>2.0</weight>
<schedulingPolicy>fair</schedulingPolicy>
</queue>
<queue name="dev">
<minResources>4096 mb, 2 vcores</minResources>
<maxResources>8192 mb, 4 vcores</maxResources>
<maxRunningApps>5</maxRunningApps>
<weight>1.0</weight>
</queue>
<queue name="test">
<minResources>2048 mb, 1 vcores</minResources>
<maxRunningApps>3</maxRunningApps>
<weight>0.5</weight>
</queue>
<!-- 用户限制 -->
<user name="hadoop">
<maxRunningApps>20</maxRunningApps>
</user>
<userMaxAppsDefault>10</userMaxAppsDefault>
<!-- 队列放置规则 -->
<queuePlacementPolicy>
<rule name="specified" create="false"/>
<rule name="primaryGroup" create="false"/>
<rule name="default" queue="dev"/>
</queuePlacementPolicy>
</allocations>
队列属性详解
| 属性 | 说明 |
|---|---|
minResources | 最小资源保证 |
maxResources | 最大资源限制 |
maxRunningApps | 最大运行应用数 |
weight | 队列权重 |
schedulingPolicy | 调度策略(fair/fifo/drf) |
队列放置规则
<queuePlacementPolicy>
<!-- 使用用户指定的队列 -->
<rule name="specified" create="false"/>
<!-- 根据用户主组创建队列 -->
<rule name="primaryGroup" create="true"/>
<!-- 根据用户名创建队列 -->
<rule name="user" create="true"/>
<!-- 默认队列 -->
<rule name="default" queue="dev"/>
</queuePlacementPolicy>
资源抢占
Fair 调度器支持资源抢占,当队列资源不足时,可以从其他队列抢占资源:
<!-- 启用抢占 -->
<property>
<name>yarn.scheduler.fair.preemption</name>
<value>true</value>
</property>
<!-- 抢占阈值 -->
<property>
<name>yarn.scheduler.fair.preemption.cluster-utilization-threshold</name>
<value>0.8</value>
</property>
调度策略对比
Fair vs Capacity
| 特性 | Capacity | Fair |
|---|---|---|
| 资源分配 | 容量保证 | 公平共享 |
| 弹性资源 | 支持 | 支持 |
| 资源抢占 | 不支持 | 支持 |
| 配置复杂度 | 较高 | 中等 |
| 适用场景 | 企业生产环境 | 多用户交互式 |
选择建议
选择 Capacity 调度器:
- 需要严格的资源隔离
- 生产环境和开发环境分离
- 需要精确控制队列容量
选择 Fair 调度器:
- 多用户共享集群
- 需要资源抢占
- 需要动态队列创建
调度器调优
通用调优参数
<!-- 调度器心跳间隔 -->
<property>
<name>yarn.resourcemanager.scheduler.client.thread-count</name>
<value>50</value>
</property>
<!-- 节点心跳间隔 -->
<property>
<name>yarn.resourcemanager.nodemanagers.heartbeat-interval-ms</name>
<value>1000</value>
</property>
<!-- 资源计算器 -->
<property>
<name>yarn.scheduler.capacity.resource-calculator</name>
<value>org.apache.hadoop.yarn.util.resource.DominantResourceCalculator</value>
</property>
Capacity 调度器调优
<!-- 计算器选择 -->
<property>
<name>yarn.scheduler.capacity.resource-calculator</name>
<value>org.apache.hadoop.yarn.util.resource.DominantResourceCalculator</value>
</property>
<!-- 最大应用数 -->
<property>
<name>yarn.scheduler.capacity.maximum-applications</name>
<value>10000</value>
</property>
<!-- 最大 AM 比例 -->
<property>
<name>yarn.scheduler.capacity.maximum-am-resource-percent</name>
<value>0.2</value>
</property>
Fair 调度器调优
<!-- 调度间隔 -->
<property>
<name>yarn.scheduler.fair.update-interval-ms</name>
<value>500</value>
</property>
<!-- 是否允许未定义队列 -->
<property>
<name>yarn.scheduler.fair.allow-undeclared-pools</name>
<value>true</value>
</property>
<!-- 用户最大应用数 -->
<property>
<name>yarn.scheduler.fair.user-as-default-queue</name>
<value>true</value>
</property>
常见问题
队列资源不足
问题:应用一直处于 ACCEPTED 状态,无法运行。
排查步骤:
- 检查队列容量配置
- 检查是否有其他应用占用资源
- 检查 AM 资源比例限制
# 查看队列状态
yarn queue -status prod
# 查看应用列表
yarn application -list
资源分配不均
问题:某些队列资源占用过多。
解决方案:
- 检查队列权重配置
- 检查用户限制配置
- 考虑启用资源抢占
小结
本章介绍了 YARN 的三种调度器:
-
FIFO 调度器:简单但效率低,适合单用户环境。
-
Capacity 调度器:多队列容量保证,适合企业生产环境。
-
Fair 调度器:公平共享资源,支持抢占,适合多用户交互式应用。
选择合适的调度器并正确配置队列,可以提高集群资源利用率和应用执行效率。