YARN中的调度器

前面说了YARN与MapReduce 1的区别,这篇就来说说YARN是怎么为任务调度资源的.

YARN中有三种调度器:FIFO(先进先出)调度器,容量调度器,公平调度器.需要注意的是,这三种调度器没有哪种最好的说法,在不同的环境下,每个都会体现出它的优点.下面就分别来说一说这三种调度器.

FIFO调度器

在Java中,我们知道有一个接口叫做Queue,即队列,Queue就遵循了先进先出的原则:

队列是一个典型的先进先出(FIFO)的容器.即从容器的一端放入事物,从另一端取出,并且事物放入容器的顺序与取出的顺序是相同的.                                                                  ----------------Java编程思想(第4版) 236页,11章11节开始对Queue的介绍.

FIFO调度器简单易懂,实现起来比较简单:先提交的任务就先执行,后提交的任务排队等待执行,且不需要修改任何配置.但是缺点也比较明显:不适合需要执行很多任务的大型集群,原因很简单,大型集群往往有大量的任务,最优的策略显然是充分利用资源并行执行,而不是集全体之力每次只执行一个任务.

YARN中的调度器_第1张图片

假如有一个任务很大,需要大量的时间,后提交的任务即使很小,也需要一直等待直到大任务完成.这对大型集群来说显然是十分不利的.这种情况下,就要考虑容量调度器与公平调度器.

容量调度器

FIFO调度器中,小任务需要在大任务后排队等待,在容量调度器中,就不存在这个问题:存在一个专门用来执行小任务的队列.可以想到,大型任务的执行时间要比FIFO调度器长,因为它不能获得集群的全部资源.而且在没有小任务的时候,预留的队列是空闲的,所以集群利用率会有一定的降低.

容量调度器允许多个组织共享一个Hadoop集群,每个组织获得全部资源的一部分.每个组织有一个专门的队列,队列内还可以进一步划分,在同一个队列中,使用FIFO调度策略进行调度.

单个作业时用的资源不会超过它所在的队列容量.但是在如果队列中有多个作业,且资源不够用的时候,如果仍然有可用的空闲资源,那么容量调度器会将剩余的空闲资源分给队列中的作业.这称为弹性队列.

YARN中的调度器_第2张图片

 正常情况下,容量调度器不会通过强行终止来抢占容器.因此假如一个队列一开始资源够用,随着任务增多,变得不够用时,这个队列就只能等待其他队列释放容器资源.我们可以通过设置队列最大容量限制来缓解这种情况,当然这是牺牲队列弹性的,要在多次尝试中发现一个平衡点.

将应用放置在哪个队列中,取决于应用本身.如,在MapReduce中,可以通过设置属性mapreduce.job.queuename来指定要使用的队列.如果队列不存在,提交时会发送一个错误.不指定队列的话,会放入default队列中.

 公平调度器

不需要预留资源,因为调度器会在运行的作业之间动态平衡资源:第一个作业(用户A)启动时,由于是唯一运行的任务,所以它独占全部资源.当第二个作业(用户B)启动时,它会分配到一半资源.当然,第二个作业从启动到获得公平共享资源的时间会有滞后,因为必须等待第一个任务的容器用完并释放出资源,当第二个作业完成后,第一个作业会再次独占全部资源.

这时,如果用户B又启动了一个任务,这个任务会与他先前提交的作业共享资源:即每个占用1/4的资源,此时用户A所占用的资源不会受到影响:仍然占有一半资源.

YARN中的调度器_第3张图片

值得一提的是,公平调度器支持抢占功能.具体来说就是,允许调度器终止那些占用资源超过其公平共享份额的队列的容器,这些容器资源释放后可以分配给资源数量低于应得份额的队列.当然因为抢占会终止容器,所以集群整体效率会降低,毕竟终止的容器还需要重新执行.

延迟调度

所有的YARN容器都试图以本地请求为重.在一个繁忙的集群上,如果应用请求某个节点,那么极有可能此时有其他容器在该节点上运行.常规情况下,应该立刻放宽本地性要求,在同机架中分配一个容器.然而在实践中发现,如果此时可以多等待一段时间,就可以提升在所请求的节点上得到一个容器的机会,从而提高了集群的效率.容量调度器公平调度器都支持延迟调度.

YARN中的每个节点管理器周期性的(每秒一次)向资源管理器发送心跳(heartbeat)请求.心跳中包括了节点管理器中正在运行的容器,新容器可用资源等信息,这样对于一个计划运行一个容器的应用而言,每个心跳就是一个潜在的调度机会.

在使用延迟调度时,调度器不会兼得的使用它收到的第一个调度机会,而是等待设定的最大数目的调度机会发生,然后才会放松本地性限制并接受下一个调度机会.

容量调度器中,可以通过设置yarn.scheduler.capacity.node-locality-delay来配置延迟调度.设置为正整数,表示调度器在放松节点限制,改为匹配同一机架上的其他借点钱,准备错过的调度机会的数量.

公平调度器也使用调度机会的数量来决定延迟时间,尽管是使用集群规模的比例来表示这个值.例如将yarn.scheduler.fair.locality.threshold.node设置为0.5,表示调度器在接受同一机架中的其他节点之间,将一直等待直到集群中的一半节点都已经给过调度机会.yarn.scheduler.fair.locality.thredhold.rack表示在接受替代所申请的机架之间需要等待的时长阈值.

你可能感兴趣的:(Hadoop相关)