当 YARN 调度器配置为 Fair 时,可以配置一个 fair-scheduler.xml。在此文件里,设置各个队列的资源和规则。
fair-scheduler.xml 的配置如下:
<?xml version="1.0"?>
<allocations>
<queue name="default">
<weight>1</weight>
<schedulingPolicy>fair</schedulingPolicy>
<minResources>314572mb,100vcores</minResources>
<maxResources>3145720mb,500vcores</maxResources>
<maxRunningApps>10</maxRunningApps>
</queue>
<queue name="queueA">
<weight>2</weight>
<schedulingPolicy>fair</schedulingPolicy>
<minResources>800000mb,200vcores</minResources>
<maxResources>2000000mb,500vcores</maxResources>
<maxRunningApps>30</maxRunningApps>
</queue>
<queue name="queueB">
<weight>2</weight>
<schedulingPolicy>fair</schedulingPolicy>
<minResources>400000mb,100vcores</minResources>
<maxResources>2000000mb,500vcores</maxResources>
<maxRunningApps>20</maxRunningApps>
</queue>
<queueMaxAMShareDefault>0.5</queueMaxAMShareDefault>
<userMaxAppsDefault>500</userMaxAppsDefault>
<queuePlacementPolicy>
<rule name="specified" create="false"/>
<rule name="primaryGroup" create="false"/>
<rule name="user" create="false" />
<rule name="reject"/>
</queuePlacementPolicy>
</allocations>
内容解释
fair-scheduler.xml 分为 3 个部分,第 1 部分是队列设置,第 2 部分是默认设置,第 3 部分是队列放置策略。
队列设置
一个队列的设置如下,如果增加一个队列,则可以在文件里新增一个 queue 项。以下为队列 queueA 的设置。
<queue name="queueA">
<weight>2</weight>
<schedulingPolicy>fair</schedulingPolicy>
<minResources>800000mb,200vcores</minResources>
<maxResources>2000000mb,500vcores</maxResources>
<maxRunningApps>30</maxRunningApps>
</queue>
配置项解释
name="queueA"
是这个队列的名称,队列的名称必须唯一。- weight: 。队列的权重,默认是 1,权重是 2 的队列将会收到默认权重 2 倍的资源。
- schedulingPolicy:队列内 application 的调度策略。允许的值包括“fifo”,“fair” 和 “drf”。默认是“fair”,即同一个队列的各 application 公平的获得队列的资源。如果为"fifo",提交时间较早的 application 优先分配容器。“drf” 是基于vcore和内存的策略,而不是只基于内存的调度策略。
- minResources: 队列的最小资源,采用"X mb, Y vcores”"的形式。如果一个队列的最小资源未能得到满足,那么它将优先获得可用资源。有可能一个队列处于最小资源之下,但是在它提交 application 时不会立刻达到最小资源,因为已经在运行的 application 可能已经使用这些资源。当有资源释放时,资源优先分配给没有达到 minResources 的队列。如果此配置超过集群最大值,虽然显示 minResources 很大,最多也只能使用集群最大值的资源。
- maxResources: 一个队列允许的最大资源,采用“X mb, Y vcores”的形式。一个队列永远不会分配资源总量超过这个限制。如果此配置超过集群最大值,最多也只会显示集群的最大值。
- maxRunningApps: 限制队列可以同时运行的 application 数量。当该队列正在运行的 application 数量达到此值,新的 application 需要排队。
默认的配置
默认的配置是当队列没有设置此项时,用此设置。
<queueMaxAMShareDefault>0.5</queueMaxAMShareDefault>
<userMaxAppsDefault>500</userMaxAppsDefault>
- queueMaxAMShareDefault:限制队列用于运行 Application Master 的资源比例,默认值是0.5f,即 50%。
- userMaxAppsDefault:限制用户可以并行运行的 application 数量。当超过此值后,该用户的 application 需要排队。
队列放置策略
<rule name="specified" create="false"/>
<rule name="primaryGroup" create="false"/>
<rule name="user" create="false" />
<rule name="reject"/>
队列放置策略用于分配新提交的 application 到哪个队列里。规则可以设置一个或者多个。提交 application 时,调度器从上往下判断规则,当一个规则满足,则不再继续判断。
create="true"
时,说明可以创建队列,谨慎设置此选项,可能导致很多队列。当 create=“false” 时判断下一规则。
常见的规则有:
- specified: 把 application 放置到提交 application 时指定的队列。
- primaryGroup: 把 application 放置到提交 application 的用户所在组的队列。此项配置需要先维护好用户组和用户。
- user: 把 application 放置到提交 application 的用户同名的队列.
- default:
<rule name="default" queue="queueB"/>
程序被放到此规则指定的规则里。
reject: application 被拒绝。
注意事项
此文件非常重要,改动之前先备份。
此文件 YARN 默认每 10 秒钟加载一次,所以改动之后,过一段时间 YARN 的界面会看到更改,如果没看到,则说明配置错误,ResoruceManager 无法解析。
在 fair-scheduler.xml 中增加队列时,YARN 队列直接显示。
在 fair-scheduler.xml 中删除队列时没有作用。有两个方法,第 1,重启 ResourceManager;第 2 ,设置要删除的队列的 maxResource 为 0M,0vcores,该队列没有资源,但是提交到此队列的用户会排序。