文章目录

01 引言

之前写过一篇博客​​《yarn入门(一篇就够了)》​​,可以知道yarn主要有三种调度器,分别为FIFO、Capacity Scheduler和Fair Scheduler,其中Hadoop3.X默认的资源调度器是Capacity Scheduler,本文就来讲讲Capacity Scheduler容量调度器。

02 Capacity Scheduler

2.1 运行原理

YARN Capacity Scheduler容量调度器(超详细解读)_hadoop


容量调度器每个队列内部先进先出, 同一时间队列中只有一个任务在执行, 队列的并行度为队列的个数

Capacity Scheduler是一个hadoop支持的可插拔的资源调度器,它允许多租户安全的共享集群资源,它们的applications在容量限制之下,可以及时的分配资源。使用操作友好的方式运行hadoop应用,同时最大化吞吐能力和集群利用率。

Capacity Scheduler提供的核心理念就是Queues(队列),这些Queues通常由管理员设定,它支持多个队列,每个队列可配置一定的资源量,每个队列采用FIFO调度策略为了在共享资源上,提供更多的控制和预见性,Capacity Scheduler支持多级queue,以确保在其他queues允许使用空闲资源之前,资源可以在一个组织的sub-queues之间共享

为了防止同一个用户一个用户可以绑定多个队列)的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源进行限定:

  • 首先,计算每个队列中正在运行的任务数与其应该分得的计算资源之间的比值,选择一个该比值最小的队列(即最闲的);
  • 其次,按照作业优先级和提交时间的顺序,同时考虑用户资源量限制和内存限制对队列内任务排序。

如上图,三个队列同时按照任务的先后顺序依次执行,比如:job11,job21和job31分别排在队列最前面,先运行,也是并行运行。

2.2 参数配置

配置参数主要划分为3块,分别为资源分配相关参数、限制应用程序数目相关参数 、队列访问和权限控制参数

2.2.1 资源分配相关参数

参数

描述

capacity

Queue的容量百分比,float类型,例如12.5。所有Queue的各个层级的capacity总和必须为100。因为弹性资源分配,如果集群中有较多的空闲资源,queue中的application可能消耗比此设定更多的Capacity。

maximum-capacity

queue capacity最大占比,float类型,此值用来限制queue中的application的弹性的最大值。默认为-1禁用“弹性限制”。

minimum-user-limit-percent

任何时间如果有资源需要,每个queue都会对分配给一个user的资源有一个强制的限制,这个user-limit可以在最大值和最小值之间。此属性就是最小值,其最大值依赖于提交applications的用户的个数。例如:假设此值为25,如果有2个用户向此queue提交application,那么每个用户最多消耗queue资源容量的50%;如果第三个user提交了application,那么任何一个user使用资源容量不能超过queue的33%;4个或者更多的用户参与,那么每个用户资源使用都不会超过queue的25%。默认值为100,表示对没有用户资源限制。

user-limit-factor

queue容量的倍数,用来设置一个user可以获取更多的资源。默认值为1,表示一个user获取的资源容量不能超过queue配置的capacity,无论集群有多少空闲资源。此值为float类型。[最多仍不超过maximum-capacity]

2.2.2 限制应用程序数目相关参数

参数

描述

maximum-applications

集群或者队列中同时处于等待和运行状态的应用程序数目上限,这是一个强限制,一旦集群中应用程序数目超过该上限,后续提交的应用程序将被拒绝,默认值为10000。所有队列的数目上限可通过参数yarn.scheduler.capacity.maximum-applications设置(可看做默认值),而单个队列可通过参数yarn.scheduler.capacity…maximum-applications设置适合自己的值

maximum-am-resource-percent

集群中用于运行应用程序ApplicationMaster的资源比例上限,该参数通常用于限制处于活动状态的应用程序数目。该参数类型为浮点型,默认是0.1,表示10%。所有队列的ApplicationMaster资源比例上限可通过参数yarn.scheduler.capacity. maximum-am-resource-percent设置(可看做默认值),而单个队列可通过参数yarn.scheduler.capacity… maximum-am-resource-percent设置适合自己的值。

2.2.3 队列访问和权限控制参数

参数

描述

state

队列状态可以为STOPPED或者RUNNING,如果一个队列处于STOPPED状态,用户不可以将应用程序提交到该队列或者它的子队列中,类似的,如果ROOT队列处于STOPPED状态,用户不可以向集群中提交应用程序,但正在运行的应用程序仍可以正常运行结束,以便队列可以优雅地退出。

acl_submit_applications

限定哪些Linux用户/用户组可向给定队列中提交应用程序。需要注意的是,该属性具有继承性,即如果一个用户可以向某个队列中提交应用程序,则它可以向它的所有子队列中提交应用程序。配置该属性时,用户之间或用户组之间用“,”分割,用户和用户组之间用空格分割,比如“user1, user2 group1,group2”。

acl_administer_queue

为队列指定一个管理员,该管理员可控制该队列的所有应用程序,比如杀死任意一个应用程序等

03 配置案例

3.1 指定调度器

首先我们需要在​​yarn-site.xml​​上配置指定的调度器:

<property>
<description>The class to use as the resource scheduler.</description>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>

3.2 配置Queues

注意:配置Queue在​​capacity-scheduler.xml​​里配置即可。

CapacityScheduler已经预定义了一个queue(即root):

  • 系统中所有的queue都是root queue的子节点;
  • 其它的queues列表可以通过“yarn.scheduler.capacity.root.queues”中指定,每个queue名称以逗号“,”分割;
  • CapacityScheduler使用了一个称为“queue path”的概念来表示“多级queue”,“queue path”是一个queue层级的全路径,且以“root”开头,路径中以“.”作为分割符。

一个指定 queue 的子节点可以通过“​​yarn.scheduler.capacity..queues​​​”风格来定义。子节点不从父节点上直接继承​​properties​​​,除非另有说明。例如,​​root queue​​​有​​a,b,c​​​三个子节点,以及​​a​​​和​​b​​​也有自己的​​sub-queue​​。

在Cloudera Manager页面,进入yarn配置,搜索“shcedule”,选择“容量调度程序配置高级配置代码段(安全阀)”,写入内容,保存:

YARN Capacity Scheduler容量调度器(超详细解读)_应用程序_02

备注:如果在运行时,添加了​​queue​​​或者修改了​​ACLs​​​,可按页面提示刷新。但是删除​​Queue​​​是不支持的,需要依次重启备用和活动的​​ResourceManager​​角色使配置生效。

完整配置如下,已添加注释:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

<!-- root队列中有哪些子队列-->
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>default,wa,yq</value>
</property>

<!-- root队列占用的容量百分比-->
<property>
<name>yarn.scheduler.capacity.root.capacity</name>
<value>100</value>
</property>

<!-- 为root队列指定一个管理员,该管理员可控制该队列的所有应用程序,比如杀死任意一个应用程序等 -->
<property>
<name>yarn.scheduler.capacity.root.acl_administer_queue</name>
<value>admin</value>
</property>

<!-- 限定哪些admin用户可向root队列中提交应用程序 -->
<property>
<name>yarn.scheduler.capacity.root.acl_submit_applications</name>
<value>admin</value>
</property>

<!-- root队列中default队列占用的容量百分比
所有子队列的容量相加必须等于100-->
<property>
<name>yarn.scheduler.capacity.root.default.capacity</name>
<value>30</value>
</property>

<!-- root队列中default队列占用的容量百分比的最大值-->
<property>
<name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
<value>35</value>
</property>

<!-- root队列中wa队列占用的容量百分比
所有子队列的容量相加必须等于100-->
<property>
<name>yarn.scheduler.capacity.root.wa.capacity</name>
<value>45</value>
</property>

<!-- root队列中wa队列占用的容量百分比的最大值-->
<property>
<name>yarn.scheduler.capacity.root.wa.maximum-capacity</name>
<value>50</value>
</property>

<!-- root队列中yq队列占用的容量百分比
所有子队列的容量相加必须等于100-->
<property>
<name>yarn.scheduler.capacity.root.yq.capacity</name>
<value>25</value>
</property>

<!-- root队列中yq队列占用的容量百分比的最大值-->
<property>
<name>yarn.scheduler.capacity.root.yq.maximum-capacity</name>
<value>30</value>
</property>

<!-- 为root队列下的wa队列指定一个管理员,该管理员可控制该队列的所有应用程序,比如杀死任意一个应用程序等 -->
<property>
<name>yarn.scheduler.capacity.root.wa.acl_administer_queue</name>
<value>admin,user01</value>
</property>

<!-- 限定哪些admin用户可向root队列中的wa队列提交应用程序 -->
<property>
<name>yarn.scheduler.capacity.root.wa.acl_submit_applications</name>
<value>admin,user01</value>
</property>

<!-- 为root队列下的yq队列指定一个管理员,该管理员可控制该队列的所有应用程序,比如杀死任意一个应用程序等 -->
<property>
<name>yarn.scheduler.capacity.root.yq.acl_administer_queue</name>
<value>admin,user02</value>
</property>

<!-- 限定哪些admin用户可向root队列中的yq队列提交应用程序 -->
<property>
<name>yarn.scheduler.capacity.root.yq.acl_submit_applications</name>
<value>admin,user02</value>
</property>

<!-- 为Job分配资源时,使用什么策略进行计算 -->
<property>
<name>yarn.scheduler.capacity.resource-calculator</name>
<value>org.apache.hadoop.yarn.util.resource.DominantResourceCalculator</value>
</property>
</configuration>

以上配置生效后可以进入Web UI页面查看,队列设置是否正确,如下所示:

YARN Capacity Scheduler容量调度器(超详细解读)_大数据_03

注意:所有队列的capacity容量和为100%

04 文末

本文主要讲解了YARN Capacity Scheduler容量调度器,如果要深入,可以参考官方的文档:

谢谢大家的阅读,本文完!