YARN中FIFO、Capacity以及Fari调度器的详细介绍

(1)FIFO Scheduler

将全部的Applications放到队列中,先按照做业的优先级高低、再按照到达时间的前后,为每一个app分配资源。若是第一个app须要的资源被知足了,若是还剩下了资源而且知足第二个app须要的资源,那么就为第二个app分配资源,and so on。html

优势:简单,不须要配置。算法

缺点:不适合共享集群。若是有大的app须要不少资源,那么其余app可能会一直等待。apache

一个例子

上图的示例:有一个很大的job1,它先提交,而且占据了所有的资源。那么job2提交时发现没有资源了,则job2必须等待job1执行结束,才能得到资源执行。app

配置

FIFO Scheduler不须要配置负载均衡

(2)Capacity Scheduler

CapacityScheduler用于一个集群(集群被多个组织共享)中运行多个Application的状况,目标是最大化吞吐量和集群利用率。ide

CapacityScheduler容许将整个集群的资源分红多个部分,每一个组织使用其中的一部分,即每一个组织有一个专门的队列,每一个组织的队列还能够进一步划分红层次结构(Hierarchical Queues),从而容许组织内部的不一样用户组的使用。
每一个队列内部,按照FIFO的方式调度Applications。当某个队列的资源空闲时,能够将它的剩余资源共享给其余队列。
oop

if there is more than one job in the queue and there are idle resources available, then the Capacity Scheduler may allocate the spare resources to jobs in the queue, even if that causes the queue’s capacity to be exceeded This behavior is known as queue elasticity.ui

配置

CapacityScheduler的配置文件etc/hadoop/capacity-scheduler.xmlspa

 说明:root队列下面有两个队列,分别为prod(40%的容量,即便用40%的集群资源)和dev(60%的容量,最大的75%  ->  说明即便prod队列空闲了,那么dev最多只能使用75%的集群资源。这样就能够保证prod中添加新的apps时立刻可使用25%的资源)。server

除了队列的容量和层次,还能够指定单个用户或者应用被分配的资源大小、同时能够运行的app数量、队列的ACLs。

能够指定app要放在哪一个队列中。若是不指定,app将会被放在名字是 default的队列中。

CapacityScheduler的队列名字必须是层次结构最后的名字,好比eng。不能是root.dev.eng或者dev.eng。

一个例子

 

上图的示例:有一个专门的队列容许小的apps提交以后可以尽快执行,注意到job1先提交,先执行时并无占用系统的所有资源(假如job1须要100G内存,可是整个集群只有100G内存,那么只分配给job1  80G),而是保留了一部分的系统资源。

(3)Fair Scheduler 

FairScheduler容许应用在一个集群中公平地共享资源。默认状况下FairScheduler的公平调度只基于内存,也能够配置成基于memory and CPU。当集群中只有一个app时,它独占集群资源。当有新的app提交时,空闲的资源被新的app使用,这样最终每一个app就会获得大约相同的资源。能够为不一样的app设置优先级,决定每一个app占用的资源百分比。FairScheduler可让短的做业在合理的时间内完成,而没必要一直等待长做业的完成。

Fair Sharing: Scheduler将apps组织成queues,将资源在这些queues之间公平分配。默认状况下,全部的apps都加入到名字为“default“的队列中。app也能够指定要加入哪一个队列中。队列内部的默认调度策略是基于内存的共享策略,也能够配置成FIFO和multi-resource with Dominant Resource Fairness

Minimum Sharing:FairScheduller提供公平共享,还容许指定minimum shares to queues,从而保证全部的用户以及Apps都能获得足够的资源。若是有的app用不了指定的minimum的资源,那么能够将超出的资源分给别的app使用。

FairScheduler默认让全部的apps都运行,可是也能够经过配置文件小智每一个用户以及每一个queue运行的apps的数量。这是针对一个用户一次提交hundreds of apps产生大量中间结果数据或者大量的context-switching的状况。

一个例子

 

 示例1:大的任务job1提交并执行,占用了集群的所有资源,开始执行。以后小的job2执行时,得到系统一半的资源,开始执行。所以每一个job能够公平地使用系统的资源。当job2执行完毕,而且集群中没有其余的job加入时,job1又能够得到所有的资源继续执行。

注意:job2提交以后并不能立刻就获取到集群一半的资源,由于job2必须等待job1释放containers。

一个例子

示例2:两个用户A和B。A提交job1时集群内没有正在运行的app,所以job1独占集群中的资源。用户B的job2提交时,job2在job1释放一半的containers以后,开始执行。job2还没执行完的时候,用户B提交了job3,job2释放它占用的一半containers以后,job3得到资源开始执行。

配置:

使用FairScheduler须要修改yarn-size.xml文件,建立allocation file,列出存在的队列和各自的 weights and capacities

prod和dev的权重也能够设置成2和3。

dev下的两个sub-queue没有指定权重,则为1:1。

在设置权重时,须要考虑default queue和用户命名的queue的权重,这些没有在xml文件中指定,可是它们的权重都是1.

队列还能够被配置minimum maximum Resources以及能够运行的最大的apps的数量

FairScheduler支持preemption(抢占),当queue占用的资源大于它应得的,那么调度器能够杀掉queue对应的containers,将yarn.scheduler.fair.preemption设置成true便可。

FairScheduler和CapacityScheduler的异同

相同:

(1)以队列划分资源

(2)设定最低保证和最大使用上限

(3)在某个队列空闲时能够将资源共享给其余队列。

不一样:

(1)Fair Scheduler队列内部支持多种调度策略,包括FIFO、Fair(队列中的N个做业,每一个得到该队列1 / N的资源)、DRF(Dominant Resource Fairness)(多种资源类型e.g. CPU,内存 的公平资源分配策略)

(2)Fair Scheduler支持资源抢占。当队列中有新的应用提交时,系统调度器理应为它回收资源,可是考虑到共享的资源正在进行计算,因此调度器采用先等待再强制回收的策略,即等待一段时间后入股仍没有得到资源,那么从使用共享资源的队列中杀死一部分任务

(3)Fair Scheduler中有一个基于任务数量的负载均衡机制,该机制尽量将系统中的任务分配到各个节点

(4)Fair Scheduler能够为每一个队列单独设置调度策略(FIFO Fair DRF)

(5)Fair Scheduler因为能够采用Fair算法,所以可使得小应用快速得到资源,避免了饿死的状况。

Hierarchical queues with pluggable policies

FairScheduler支持层次队列(hierarchical queues),全部队列都从root队列开始,root队列的孩子队列公平地共享可用的资源。孩子队列再把可用资源公平地分配给他们的孩子队列。apps可能只会在叶子队列被调度。此外,用户能够为每一个队列设置不一样的共享资源的策略,内置的队列策略包括 FifoPolicy, FairSharePolicy (default), and DominantResourceFairnessPolicy。

用户能够经过继承org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.SchedulingPolicy实现本身定义的策略。

(4)Delay Scheduling&Dominant Resource Fairness

CapacityScheduler和FairScheduler都支持Delay Scheduling和DRF

不一样的apps对CPU和内存的需求量不同,有的可能须要大量的CPU和一点点内存,有的可能正相反。这会使调度变得复杂。YARN解决的方法是Dominant Resource Fairness,即看app主要须要的资源是什么,用它做为该app对集群使用的度量。 

参考:

(1)《Hadoop The Definitive Guide 4th》

(2)官方文档

http://hadoop.apache.org/docs/r2.7.2/hadoop-yarn/hadoop-yarn-site/CapacityScheduler.html

http://hadoop.apache.org/docs/r2.7.2/hadoop-yarn/hadoop-yarn-site/FairScheduler.html

相关文章
相关标签/搜索