调度器scheduler是yarn中重要角色之一,它负责分配container资源给application,有如下三种调度器可供配置选择,分别是FIFO Scheduler,Capacity Scheduler和Fair Scheduler,可以通过yarn-site.xml配置自己的调度器。
FIFO Scheduler
FIFO调度器使比较low的一种调度器,它遵循先进先出的原则,即一个queue中application先进先出,这种对资源使用的策略是队列中哪个application先拿到了资源,则其需先执行完后释放container资源才能执行队列中下一个application。FIFO Scheduler调度器模式下,一个job提交后抢占到的资源将占据到100%,队列中其他job由于没有多余资源可用只能等待,因此如果一个队列中有一个执行时间很长但不紧急的job和许多执行时间短但紧急的job,则会出现问题。执行时间长的job如果先执行会一直占用资源,而小job只能等待。另外,FIFO Scheduler不需要配置可以直接拿来用。
Capacity Scheduler
Apache下的Hadoop调度器默认采用的就是Capacity Scheduler,它对资源的使用不仅仅只有一个队列,一般会给一个执行时间长的application分配一个队列(如图queue A),给执行时间短的application也分配一个队列(如图queue B)。这样的话执行时间长的job和短的job都可以获取container资源执行,如提交job1会立马执行,只占据它所拥有的那一部分container资源,当job2提交后也会获取它的一部分资源执行,这样做的缺点是执行时间长的job会占用相对少的资源,从而比FIFO Scheduler情况下会执行更多的时间来完成任务。另外使用Capacity Scheduler是在etc/hadoop/yarn-site.xml文件中配置的,配置具体信息需在etc/hadoop/Capacity-scheduler.xml中完成,如配置队列A和B、各自权重、队列可以上浮的最大资源占比均是在xml文件中完成。
root是顶级队列,下面可以配置量产(prod)和开发(dev)队列,开发队列中又可以继续拆分A和B队列,队列存在层级关系。
root
├── prod
└── dev
├── A
└── B
以下是配置capacity-scheduler.xml示例。
yarn.scheduler.capacity.root.queues
prod,dev
yarn.scheduler.capacity.root.dev.queues
A,B
yarn.scheduler.capacity.root.prod.capacity
40
yarn.scheduler.capacity.root.dev.capacity
60
yarn.scheduler.capacity.root.dev.maximum-capacity
75
yarn.scheduler.capacity.root.dev.A.capacity
50
yarn.scheduler.capacity.root.dev.B.capacity
50
队列配置完成后如果想让application指派到这个对列中执行,可以在代码中进行配置,注意后面队列名不是全局名,就是队列层级中最后的名字即可,如果配置全局名会报错。
configuration.set("mapreduce.job.queuename","A");
Fair Scheduler
最后一种是Fair Scheduler,也称作公平调度器,这种调度器相对前两个调度器总体来说可以更大的利用资源,即面向整体的job,它是资源利用最好的。如下图所示当job1提交后,发现队列中没有其他application,它会占用总个队列资源开始执行,当job2提交后需要资源,此时队列会分一半的资源给job2,但是不会立马给它,还需要job1释放一半的资源后,job2得到资源才能运行任务,这里有一个等待时间,它是可以设置的,超过等待时间如果job1依然没有释放资源则会抢占资源。当job2执行完后释放资源,job1又会占用队列全部的资源继续执行,这种模式看上去就是充分的利用了资源同时又让任务不会长时间等待资源。Hadoop分布式项目CDH默认会使用Fair Scheduler,其他的如果使用它可以配置yarn-site.xml来完成,将yarn.resourcemanager.scheduler.class设置为公平调度器的完全限定名org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler。
公平调度器具体细节的配置也有一个文件,其在fair-scheduler.xml中完成,参考上面capacity-scheduler的层级关系,也可以在公平调度器实现。
fair
40
60
A
B
上面说的抢占资源,也是可以设置的,通过将yarn-site.xml的yarn.scheduler.fair.preemption属性设置为true就全面启动抢占功能,即允许调度器终止job1占用的的本来属于job2的资源,job1被中止的任务需要重新执行,某种意义上来说这样会降低整个集群的任务执行效率。
参考博文:
(1)《hadoop核心权威指南第四版》