Hadoop -Yarn Scheduler调度器
理想情况下,我们应用对Yarn资源的请求应该立刻得到满足,但现实情况资源往往是有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能的到相应的资源。在Yarn中,负责给应用分配资源的就是Scheduler。其实调度本身就是一个难题,很难找到一个完美的策略可以解决所有的应用场景。为此,Yarn提供了多种调度器和可配置的策略供我们选择
在Yarn中有三种调度器可以选择:FIFO Scheduler
,Capacity Scheduler
,FairScheduler
-
FIFO Scheduler
先进先出,队列式,先提交的job优先获得资源,后提交的,后获得资源.这种调度方式很容易导致,大任务占用资源很长一段时间,二小任务一直在队列后面等候大任务资源的释放,资源利用率不高
FIFO Scheduler不需要配置
-
Capacity Scheduler
按容量进行资源的切分,当提交大任务时,会提交到大容量资源队列,当提交小任务时,会提交到小任务队列,这样保证了小任务提交时,无需等待大任务的完成,直接就进入小任务队列进行执行.但这样又出现一个问题,当只有一个大任务时,无法100%利用资源,因为小任务队列的资源已经提前占好资源了,就容易出现占着茅坑不拉屎的情况
配置
说明:root队列下面有两个队列,分别为prod(40%的容量,即使用40%的集群资源)和dev(60%的容量,最大的75% -> 说明即使prod队列空闲了,那么dev最多只能使用75%的集群资源。这样就可以保证prod中添加新的apps时马上可以使用25%的资源)。
除了队列的容量和层次,还可以指定单个用户或者应用被分配的资源大小、同时可以运行的app数量、队列的ACLs。
可以指定app要放在哪个队列中。如果不指定,app将会被放在名字是 default的队列中。
CapacityScheduler的队列名字必须是层次结构最后的名字,比如eng。不能是root.dev.eng或者dev.eng
-
Fair Scheduler
公平调度器,yarn会动态为我们的任务分配内存,当提交大任务时,会直接给全部资源,此时如果来了任务,只需要等待大任务的小task完成释放container资源就可以执行了,小任务执行完,又将资源归还给大任务,让资源得到了充分的利用
**示例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即可。