EMR YARN 默认使用 Capacity Scheduler。业务需要多个队列动态、公平地共享集群资源时,可切换为 Fair Scheduler。本文介绍如何启用 Fair Scheduler 以及参数的手动配置方法。
EMR YARN 队列支持 Capacity Scheduler(默认)、Fair Scheduler 两类调度器,可满足不同场景下资源分配与调度的诉求,两类调度器对比介绍如下。
对比维度 | CapacityScheduler | FairScheduler |
|---|---|---|
核心目标 | 保证各队列获得预设容量 | 让活跃队列或作业逐步获得公平份额 |
资源配置方式 | 主要按容量比例或绝对资源配置,如队列占 30% | 主要配置最小/最大资源和权重 |
空闲资源 | 队列可临时借用其他队列未使用的资源,但受最大容量限制 | 空闲资源会动态分给有任务的队列 |
资源竞争 | 更强调组织间的容量保障和隔离 | 更强调共享集群时的动态公平 |
抢占逻辑 | 可通过抢占机制收回超出保障份额的资源 | 可在队列长期低于公平份额时触发抢占 |
配置文件 | capacity-scheduler.xml | fair-scheduler.xml |
典型场景 | 多部门、多租户,资源预算和配额相对明确 | 多用户共享集群,任务量变化明显,希望减少小任务等待 |
EMR 默认情况 | EMR 中 YARN 默认使用 | 需要修改调度器配置并部署 Fair 队列文件 |
本文为您介绍如何从默认的 Capacity Scheduler 调度器切换为 Fair Scheduler 调度器,并进行队列资源与调度规则的配置。
说明
Capacity Scheduler 调度器的队列资源与调度规则的配置详情请参见 队列管理:Capacity Scheduler。
yarn.resourcemanager.scheduler.class 设置为 org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler。yarn.resourcemanager.scheduler.monitor.enable 设置为 false。EMR 控制台提供了可视化的 YARN 队列管理功能,支持新增队列、修改队列配置、调整队列层级、启停队列等操作。
队列管理包含以下两个页签:
在队列管理页面的 队列配置 页签中,单击右上方的 添加队列,在弹出的侧边框中配置队列参数。
新增子队列时,默认父级队列为 root 队列,您可按需单击添加队列为 root 父队列添加更多子队列,并调整所有子队列的队列名称、权重等参数,子队列的核心配置参数如下。
参数 | 说明 |
|---|---|
weight | 同一父队列下各子队列的相对资源分配权重,不代表任务执行优先级。其他条件相同时,权重越大,公平份额越大;实际资源使用仍受资源需求及资源上下限约束。 |
minResources | 队列的最小资源份额。当资源不足且队列尚未达到该份额时,调度器优先向其分配可用资源。如果资源已被运行中的应用占用,不保证队列立即达到该份额。
|
maxResources | 队列可分配资源的上限,同时受父队列资源上限约束。
|
maxRunningApps | 队列内同时运行的应用数量上限。 |
schedulingPolicy | 控制队列内的资源分配方式:
|
操作备注 | 为当前调度规则添加操作备注。 |
配置完成后,单击 确定 完成子队列添加。
您可以在队列管理页面查看 YARN 队列的队列列表,对于子队列,您可单击 修改 按钮,编辑修改队列的权重、资源分配逻辑等;也可为 root 父级队列添加新的子队列。
潮汐调度规则适用于集群资源需求随时间周期性变化的场景。您可以根据业务高峰和低峰分别配置调度规则,例如早上 8 点提高分析师任务队列的资源占比,晚上 8 点再调整为离线任务优先,通过潮汐调度规则在指定时间自动切换 YARN 子队列的资源分配策略,减少人工操作,并提升集群资源利用率和业务高峰期的资源保障能力。
在队列管理页面的 调度规则 页签中,单击右上方的 添加规则,在弹出的侧边框中配置队列参数。
参数 | 说明 |
|---|---|
规则名称 | 自定义调度规则的名称,用于后续查询、标识。 |
队列配置 | 设置当前调度规则适用的队列,您可在下拉框中选择已有的子队列,并设置当前调度规则下,对应子队列的权重、资源分类逻辑等。 |
Cron 表达式 | 使用 Cron 表达式设置调度执行周期。
|
操作备注 | 为当前调度规则添加操作备注。 |
完成配置后,单击 添加,完成调度规则配置。
您可按需配置多个调度规则。
您可以在调度规则页面查看已添加的调度规则列表。
当需要使用控制台未覆盖的参数时,例如配置用户到队列的映射,设置队列的抢占策略时,可参考以下手动配置方法。
登录到运行 Yarn 的服务器节点。
使用文本编辑器(如 vi 或 nano)创建一个新的配置文件,例如 fair-scheduler.xml。
在配置文件中,首先定义根队列(root queue),这是所有其他队列的父队列。
<allocations><queue name="root"><minResources>10000 mb,0 vcores</minResources><maxResources>40000 mb,4 vcores</maxResources><weight>1.0</weight><schedulingPolicy>fair</schedulingPolicy></queue></allocations>
这里定义了根队列的最小资源(10000MB 内存和 0 个虚拟核心)、最大资源(40000MB 内存和 4 个虚拟核心)、权重(1.0)以及调度策略为 fair。
您可在配置文件中进行更多的配置参数设置,以下为一些典型场景的配置示例。
在根队列内部,可以添加多个子队列。例如,添加两个子队列 queue1 和 queue2:
<queue name="queue1"><minResources>5000 mb,0 vcores</minResources><maxResources>20000 mb,2 vcores</maxResources><weight>2.0</weight><schedulingPolicy>fair</schedulingPolicy></queue><queue name="queue2"><minResources>3000 mb,0 vcores</minResources><maxResources>15000 mb,1 vcores</maxResources><weight>1.5</weight><schedulingPolicy>fair</schedulingPolicy></queue>
每个子队列都有自己的最小和最大资源限制、权重以及调度策略。权重决定了队列在资源分配中的相对重要性。
如果需要将特定用户的应用程序分配到特定队列,可以配置用户到队列的映射。例如,将用户 user1 的应用程序分配到 queue1,用户 user2 的应用程序分配到 queue2:
<user name="user1"><queue>queue1</queue></user><user name="user2"><queue>queue2</queue></user>
如果希望队列能够在资源不足时抢占其他队列的资源,可以配置抢占策略。例如,允许 queue1 在资源不足时抢占其他队列的资源:
将 yarn.resourcemanager.scheduler.monitor.enable 设置为 true。
修改抢占策略
<queue name="queue1"><minResources>5000 mb,0 vcores</minResources><maxResources>20000 mb,2 vcores</maxResources><weight>2.0</weight><schedulingPolicy>fair</schedulingPolicy><queueMaxAMShare>0.5</queueMaxAMShare><fairSharePreemptionTimeout>60000</fairSharePreemptionTimeout><fairSharePreemptionThreshold>0.5</fairSharePreemptionThreshold></queue>
这里的 queueMaxAMShare 表示队列中应用程序的最大资源分配比例,fairSharePreemptionTimeout 表示抢占超时时间(毫秒),fairSharePreemptionThreshold 表示抢占阈值。
保存 fair-scheduler.xml 配置文件。
将配置文件复制到 Yarn 的配置目录中,通常为 $HADOOP_HOME/etc/hadoop/ 目录。
在 Yarn 的配置文件 yarn-site.xml 中,添加或修改以下属性,指定使用 Fair 调度器和配置文件路径:(可以在组件管理 - 服务管理 - Yarn - 配置文件中修改)
<property><name>yarn.resourcemanager.scheduler.class</name><value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value></property><property><name>yarn.scheduler.fair.allocation.file</name><value>/path/to/fair-scheduler.xml</value></property>
确保将 /path/to/fair-scheduler.xml 替换为实际的配置文件路径。
在EMR对应集群的 组件管理 - 服务管理 - Yarn中重启Resource Manager以及所有Node Manager。
提交一些应用程序到 Yarn 集群,并查看它们是否按照 Fair 队列的配置进行资源分配。可以使用 Yarn 的命令行工具(如 yarn application -list 等)来查看应用程序的运行状态和资源分配情况。