YARN中FIFO、Capacity以及Fari调度器的详细介绍 (2)

FairScheduler默认让所有的apps都运行,但是也可以通过配置文件小智每个用户以及每个queue运行的apps的数量。这是针对一个用户一次提交hundreds of apps产生大量中间结果数据或者大量的context-switching的情况。

一个例子

YARN中FIFO、Capacity以及Fari调度器的详细介绍

 

 示例1:大的任务job1提交并执行,占用了集群的全部资源,开始执行。之后小的job2执行时,获得系统一半的资源,开始执行。因此每个job可以公平地使用系统的资源。当job2执行完毕,并且集群中没有其他的job加入时,job1又可以获得全部的资源继续执行。

注意:job2提交之后并不能马上就获取到集群一半的资源,因为job2必须等待job1释放containers。

一个例子

YARN中FIFO、Capacity以及Fari调度器的详细介绍

示例2:两个用户A和B。A提交job1时集群内没有正在运行的app,因此job1独占集群中的资源。用户B的job2提交时,job2在job1释放一半的containers之后,开始执行。job2还没执行完的时候,用户B提交了job3,job2释放它占用的一半containers之后,job3获得资源开始执行。

配置:

YARN中FIFO、Capacity以及Fari调度器的详细介绍

YARN中FIFO、Capacity以及Fari调度器的详细介绍

使用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即可。

FairScheduler和CapacityScheduler的异同

相同:

(1)以队列划分资源

(2)设定最低保证和最大使用上限

(3)在某个队列空闲时可以将资源共享给其他队列。

不同:

(1)Fair Scheduler队列内部支持多种调度策略,包括FIFO、Fair(队列中的N个作业,每个获得该队列1 / N的资源)、DRF(Dominant Resource Fairness)(多种资源类型e.g. CPU,内存 的公平资源分配策略)

(2)Fair Scheduler支持资源抢占。当队列中有新的应用提交时,系统调度器理应为它回收资源,但是考虑到共享的资源正在进行计算,所以调度器采用先等待再强制回收的策略,即等待一段时间后入股仍没有获得资源,那么从使用共享资源的队列中杀死一部分任务

(3)Fair Scheduler中有一个基于任务数量的负载均衡机制,该机制尽可能将系统中的任务分配到各个节点

(4)Fair Scheduler可以为每个队列单独设置调度策略(FIFO Fair DRF)

(5)Fair Scheduler由于可以采用Fair算法,因此可以使得小应用快速获得资源,避免了饿死的情况。

Hierarchical queues with pluggable policies

FairScheduler支持层次队列(hierarchical queues),所有队列都从root队列开始,root队列的孩子队列公平地共享可用的资源。孩子队列再把可用资源公平地分配给他们的孩子队列。apps可能只会在叶子队列被调度。此外,用户可以为每个队列设置不同的共享资源的策略,内置的队列策略包括 FifoPolicy, FairSharePolicy (default), and DominantResourceFairnessPolicy。

用户可以通过继承org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.SchedulingPolicy实现自己定义的策略。

(4)Delay Scheduling&Dominant Resource Fairness

CapacityScheduler和FairScheduler都支持Delay Scheduling和DRF

不同的apps对CPU和内存的需求量不一样,有的可能需要大量的CPU和一点点内存,有的可能正相反。这会使调度变得复杂。YARN解决的方法是Dominant Resource Fairness,即看app主要需要的资源是什么,用它作为该app对集群使用的度量。 

参考:

(1)《Hadoop The Definitive Guide 4th》

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpsdsj.html