赞
踩
理想情况下,YARN应用发出的资源请求应该立刻给予满足,然而在现实中,资源是有限的。在一个繁忙的集群上,一个应用经常需要等待才能得到所需要的资源。
YARN调度器的工作就是根据既定策略为应用分配资源。
调度通常是一个难题,并且没有一个所谓的“最好”策略,这也是为什么YARN提供了很多种调度器和可配置策略供人们选择的原因,YARN中有三种调度器可用,即FIFO Scheduler(先进先出调度器)、Capacity Scheduler(容量调度器)、Fair Scheduler(公平调度器)。
Hadoop最初是为批处理作业而设计的,Hadoop1.0仅采用了一个简单的FIFO调度机制来分配任务。先进先出调度器(FIFO Scheduler)将应用放置在一个队列中从,然后按照提交的顺序(先进先出)运行应用。首先为队列中第一个应用的请求分配资源,第一个应用的请求被满足后再依次为队列中下一个应用服务。
作业调度原理如图所示:
当使用FIFO调度器时,小作业(job2)一直被阻塞,直至大作业(job1)完成。
容量调度器(Capacity Scheduler)允许多个组织共享一个Hadoop集群,每个组织可以分配到全部集群资源的一部分。每个组织被配置一个专门的队列,每个队列被配置为可以使用一定的集群资源。队列可以进一步按层次划分,这样每个组织内部的不同用户能够共享该组织队列所分配的资源。在一个队列内,使用FIFO调度策略对应用进行调度。
作业调度原理如图所示:
可以看出,单个作业使用的资源不会超过其队列(queue)容量。然而,如果队列中有多个作业,而且队列资源不够用了,这时如果仍有可用的空闲资源,那么Capacity Scheduler可能会将空余的资源分配给队列中的作业,哪怕这会超出队列容量。
正常操作时,Capacity Scheduler不会通过强行中断来抢占容器(Container)。因此,如果一个队列一开始资源够用,随着需求增长,资源开始不够用时,这个队列就只能等着其他队列释放容器资源。缓解这种情况的方法是为队列设置一个最大容量限制,这样这个队列就不会过多侵占其他队列的容量。
当然,这样做是以牺牲队列弹性为代价的,因此需要在不断尝试和失败中找到一个合理的折中。
公平调度器(Fair Scheduler)旨在为所有运行的应用公平分配资源
下图展示了同一个队列中的应用是如何实现资源公平共享的。
假设有两个用户A和B,分别拥有自己的队列queueA和queueB。A启动一个作业job1,在B没有需求时A会分配到全部可用资源;当A的作业仍在运行时B启动一个作业job2,一段时间后,按照先前看到的方式,每个作业都用了一半的集群资源。这时,如果B启动第二个作业job3且其他作业仍在运行,那么job3和job2共享资源,因此B的每个作业将占用四分之一的集群资源,而A仍继续占用一半的集群资源。最终的结果就是资源在用户之间实现了公平共享。
总的来说,如果应用场景需要先提交的job先执行,那么就使用FIFO SCheduler;如果所有的job都有机会获得资源,就使用Capacity Scheduler和Fair Scheduler。Capacity Scheduler不足的地方就是多个队列资源不能相互抢占,每个队列会提前分走资源(即使队列中没有job),所以一般情况下都选择使用Fair Scheduler。FIFO Scheduler一般不会单独使用,公平调度支持在某个队列内部选择Fair Scheduler还是FIFO Scheduler,可以认为Fair Scheduler是一个混合的调度器。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。