(1)FIFO Scheduler
将所有的Applications放到队列中,先按照作业的优先级高低、再按照到达时间的先后,为每个app分配资源。如果第一个app需要的资源被满足了,如果还剩下了资源并且满足第二个app需要的资源,那么就为第二个app分配资源,and so on。
优点:简单,不需要配置。
缺点:不适合共享集群。如果有大的app需要很多资源,那么其他app可能会一直等待。
一个例子
上图的示例:有一个很大的job1,它先提交,并且占据了全部的资源。那么job2提交时发现没有资源了,则job2必须等待job1执行结束,才能获得资源执行。
配置FIFO Scheduler不需要配置
(2)Capacity SchedulerCapacityScheduler用于一个集群(集群被多个组织共享)中运行多个Application的情况,目标是最大化吞吐量和集群利用率。
CapacityScheduler允许将整个集群的资源分成多个部分,每个组织使用其中的一部分,即每个组织有一个专门的队列,每个组织的队列还可以进一步划分成层次结构(Hierarchical Queues),从而允许组织内部的不同用户组的使用。
每个队列内部,按照FIFO的方式调度Applications。当某个队列的资源空闲时,可以将它的剩余资源共享给其他队列。
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.
配置CapacityScheduler的配置文件etc/hadoop/capacity-scheduler.xml
说明: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。
一个例子
上图的示例:有一个专门的队列允许小的apps提交之后能够尽快执行,注意到job1先提交,先执行时并没有占用系统的全部资源(假如job1需要100G内存,但是整个集群只有100G内存,那么只分配给job1 80G),而是保留了一部分的系统资源。
(3)Fair SchedulerFairScheduler允许应用在一个集群中公平地共享资源。默认情况下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使用。