跳到主要内容

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

特性CapacityFair
资源分配容量保证公平共享
弹性资源支持支持
资源抢占不支持支持
配置复杂度较高中等
适用场景企业生产环境多用户交互式

选择建议

选择 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 状态,无法运行。

排查步骤:

  1. 检查队列容量配置
  2. 检查是否有其他应用占用资源
  3. 检查 AM 资源比例限制
# 查看队列状态
yarn queue -status prod

# 查看应用列表
yarn application -list

资源分配不均

问题:某些队列资源占用过多。

解决方案:

  1. 检查队列权重配置
  2. 检查用户限制配置
  3. 考虑启用资源抢占

小结

本章介绍了 YARN 的三种调度器:

  1. FIFO 调度器:简单但效率低,适合单用户环境。

  2. Capacity 调度器:多队列容量保证,适合企业生产环境。

  3. Fair 调度器:公平共享资源,支持抢占,适合多用户交互式应用。

选择合适的调度器并正确配置队列,可以提高集群资源利用率和应用执行效率。