介绍
在YARN中,资源调度器(Scheduler)是ResourceManager中的重要组件,主要负责对整个集群(CPU,内存)的资源进行分配和调度,分配以资源Container的形式分发到各个应用程序中(如MapReduce作业),应用程序与资源所在节点的NodeManager协作利用Container完成具体的任务(如Reduce Task)。
Scheduler以可插拔的形式来配置,框架默认提供了三种Scheduler:
1)FIFO Scheduler:
先进先出即先来后到。作业提交作业作为资源分配优先级的重要因素。
2)Capacity Scheduler:
以Capacity为中心,把资源划分到若干个队列中,各个队列内根据自己的逻辑分配资源。例如下图中队列A可以调度的资源可以占80%,队列B占有剩下的20%,各队列接受相应的作业请求,在自己的资源中分配。
3)Fair Scheduler:
秉承公平性原则,尽可能让各个作业得到的资源平均。下图中的作业2提交之后,原本Job1占有的资源拨出一般给作业2,从而达到“公平”。
Capacity Scheduler配置
采用Capacity调度的集群,资源被划分到一系列的Queue中,每个队列管理整个集群资源的一部分。队列内部可以再嵌套,形成层级结构。队列内资源采用FIFO的方式分配。
通常情况下,作业不能使用超过队列容量的资源,但是如果一个队列中有多于一个的作业,并且有空闲的资源,则调度器会为作业分配资源,即使这会导致队列超出容量限制。该特性叫队列弹性(queue elasticity).为了避免队列占用过多其他队列的资源,可以配置一个最大容量,队列只能使用该容量以内的资源,但是会牺牲一定的弹性。
Scheduler配置
假设我们有下面的队列层次:
- root
- prod
- dev
- eng
- science
在这个层次结构中,root队列下定义了prod和dev两个队列,假设占有集群资源容量的比例分别为40%和60%。dev下又分为各占50%容量的eng和science队里。下面展示的是该结构下的一个配置文件(capacity-scheduler.xml):
<configuration>
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>prod,dev</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.dev.queues</name>
<value>eng,science</value>
</property>