HadoopFairScheduler - huangyuefeng/study GitHub Wiki
Hadoop的Fair Scheduler原理实例
Fair Scheduler是Facebook公司提出的调度器技术。
- 举个例子
假设一个Hadoop集群中共有100有slot(为了简单,不区分Map或者Reduceslot)和四个资源池(依次为P1、P2、P3和P4),
资源池的最小资源量依次为:25、19、26和28(sum=98)。
如图a所示,在某一时刻,四个资源池实际需要的资源量(与未运行的任务数目相关)依次为20、26、37和30(sum=113),
则资源分配过程如下:
- 步骤1
根据最小资源量将资源分配各个资源池。
对于资源池P1而言,由于它实际需要的资源量少于其最小资源量,因此只需将它实际需要的资源分配给它即可,如图b和图c所示。
经过这一轮分配,四个资源池获得的slot数目依次为:20、19、26和28。
- 步骤2
经过第一轮分配后,尚剩余7个slot,此时需按照权重将剩余资源分配给尚需资源的资源池P2,P3和P4。
不妨假设这三个资源池的权重依次为2.0、3.0和2.0,则它们额外分得的slot数目依次为2、3和2。
这样,如图d所示,三个资源池最终获得的资源总量依次为:21、29和30。
- 步骤3
在各个资源池内部,按照作业的权重将资源分配给各个作业。
以P4为例,假设P4中有三个作业,优先级依次为VERY_HIGH,NORMAL和NORMAL,则它们可能获得的slot数目依次为:
4/(4+1+1)*30=20
1/(4+1+1)*30=5
1/(4+1+1)*30=5
ps:VERY_HIGH=4,HIGH=2,NORMAL=1
这三个值即为对应作业的公平共享量。
- 注意
公平共享量只是理论上的资源分配量(理想值),在实际资源分配时,调度器应尽量将与公平共享量相等的资源分配给作业。
Hadoop的Capacity Scheduler原理
CapacityScheduler是Yahoo!开发的多用户调度器。它以队列为单位划分资源,每个队列可设定一定比例的资源最低保证和使用上限,同时,每个用户也可设定一定的资源使用上限以防止资源滥用,而当一个队列的资源有剩余时,可暂时将剩余资源共享给其他队列。
总之,CapacityScheduler主要有以下几个特点。
- 容量保证
管理员可为每个队列设置资源最低保证和资源使用上限,而所有提交到该队列的作业共享这些资源。
- 灵活性
如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的作业提交,则其他队列释放资源后会归还给该队列。相比于HOD调度器,这种资源灵活分配的方式可明显提高资源利用率。
- 多重租赁
支持多用户共享集群和多作业同时运行。为防止单个作业、用户或者队列独占集群中的资源,管理员可为之增加多重约束(比如单个作业同时运行的任务数等)。
- 支持资源密集型作业
当一个作业的单个任务需要的资源高于默认设置时,可同时为其分配多个slot,但需要注意的是,当前仅支持内存密集型作业。
- 支持作业优先级
默认情况下,在每个队列中,空闲资源优先分配给最早提交的作业,但也可让其支持作业优先级,
这样,优先级高的作业将优先获取资源(两个作业优先级相同时,再按照提交时间优先的原则分配资源FIFO)。
需要注意的是,当前CapacityScheduler曾不支持资源抢占,现在已经支持。
也就是说,如果优先级高的作业提交时间晚于优先级低的作业,则高优先级作业需等待低优先级作业释放资源。
比较
两者在早期区别较多,经过一段时间的发展,其实越来越像了。 下面介绍比较下:
item | FairScheduler | CapacityScheduler |
---|---|---|
提出者 | Yahoo! | |
设计思路 | 基于最大最小公平算法将资源分配给各个资源池或用户 | 资源按比例分配给各个队列,并添加各种严格限制防止吃独食 |
资源抢占 | ok | weak |
task多slot | none | ok |