01 引言
之前写过一篇博客《yarn入门(一篇就够了)》,可以知道yarn主要有三种调度器,分别为FIFO、Capacity Scheduler和Fair Scheduler,其中Hadoop3.X默认的资源调度器是Capacity Scheduler,本文就来讲讲Capacity Scheduler容量调度器。
02 Capacity Scheduler
2.1 运行原理
容量调度器每个队列内部先进先出, 同一时间队列中只有一个任务在执行, 队列的并行度为队列的个数。
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 资源分配相关参数
2.2.2 限制应用程序数目相关参数
2.2.3 队列访问和权限控制参数
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”,选择“容量调度程序配置高级配置代码段(安全阀)”,写入内容,保存:
备注:如果在运行时,添加了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页面查看,队列设置是否正确,如下所示:
注意:所有队列的capacity容量和为100%
04 文末
本文主要讲解了YARN Capacity Scheduler容量调度器,如果要深入,可以参考官方的文档:
- Capacity Scheduler:https://hadoop.apache.org/docs/r2.4.1/hadoop-yarn/hadoop-yarn-site/CapacityScheduler.html
- Fair Scheduler:https://hadoop.apache.org/docs/r2.4.1/hadoop-yarn/hadoop-yarn-site/FairScheduler.html
谢谢大家的阅读,本文完!