HadoopFairScheduler - huangyuefeng/study GitHub Wiki

Hadoop的Fair Scheduler原理实例

src_url

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。

FairScheduler

  • 步骤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
提出者 Facebook Yahoo!
设计思路 基于最大最小公平算法将资源分配给各个资源池或用户 资源按比例分配给各个队列,并添加各种严格限制防止吃独食
资源抢占 ok weak
task多slot none ok

更多比较