Hadoop作业调度器主要有三种:FIFO、容量(Capacity Scheduler)和公平(Fair Scheduler)。
Apache Hadoop默认的资源调度器:容量调度器Capacity Scheduler。
CDH框架默认调度器是Fair Scheduler。

1 FIFO

单队列,先来先服务。
优点:简单易懂;
缺点:不支持多队列,生产环境很少使用。

2 容量调度器

Capacity Scheduler是Yahoo开发的多用户调度器。

Hadoop 容量调度器_大数据


特点:

(1)多队列:每个队列配置一定资源,队列中采用FIFO调度策略。

(2)容量保证:可以给每个队列设置资源使用的下限和上限。

(3)灵活性:某一队列的剩余资源可以暂时共享给需要资源的队列,当该队列由新的应用程序提交时,则别的队列归还借调的的资源。

(4)多租户:支持多用户共享集群和多应用程序同时运行。(防止统一用户独占队列资源,调度器会限定同一用户提交的专业所占资源)

容量调度器资源分配算法

Hadoop 容量调度器_大数据_02


(1)队列资源分配:从root开始深度遍历,有选择资源占用率最低的队列进行分配。

(2)作业资源分配:按作业优先级和提交时间分配。

(3)容器资源分配:按容器优先级分配,优先级相同,按照数据本地性原则:
    (i)任务和数据在同一节点;
    (ii)任务和数据在同一机架;
    (iii)任务和数据不在同一节点和同一机架。

3 公平调度器

同队列所有任务共享资源,在时间尺度上获得公平的资源。

Hadoop 容量调度器_Hadoop 容量调度器_03


(1)公平调度器与容量调度器相同点

    (i)多队列:每个队列配置一定资源,队列中采用FIFO调度策略。

    (ii)容量保证:可以给每个队列设置资源使用的下限和上限。

    (iii)灵活性:某一队列的剩余资源可以暂时共享给需要资源的队列,当该队列由新的应用程序提交时,则别的队列归还借调的的资源。

    (iv)多租户:支持多用户共享集群和多应用程序同时运行。(防止统一用户独占队列资源,调度器会限定同一用户提交的专业所占资源)

(2)公平调度器与容量调度器不相同点
    (i)调度策略不同
        容量调度器:优先选择资源利用率低的队列。
        公平调度器:优先选择对资源缺额比例大的队列。

    (ii)每个队列单独设置资源分配方式:
        容量调度器:FIFO、DRF
        公平调度器:FIFO、FAIR、DRF

缺额:公平调度器设置在时间尺度上作业获得公平的资源。但某一时刻作业应获资源和实际获取资源的差叫缺额。(因为作业刚进入不能马上获得资源的均分)

公平调度队列资源分配方式
(1)FIFO:公平调度器使用FIFO则变为容量调度器。

(2)FAIR:每一步都按照公平策略分配资源。

    具体资源分配流程:

    (I)选择队列:从root开始深度遍历,有选择资源占用率最低的队列进行分配。

    (II)选择作业:按作业优先级和提交时间分配。

    (III)选择容器:按容器优先级分配,优先级相同,按照数据本地性原则

        (i)任务和数据在同一节点;

        (ii)任务和数据在同一机架;

        (iii)任务和数据不在同一节点和同一机架。

Hadoop 容量调度器_hadoop_04


实际最小资源份额:minShare=Min(资源需求量,配置的最小资源)

是否饥饿:isNeedy=资源使用量<minShare

资源分配比:minShareRatio=资源使用量/Max(minShare,1)

资源使用权重比:useToWeightRatio=资源使用量/权重

例子:

Hadoop 容量调度器_Hadoop 容量调度器_05


(I)队列资源分配

  需求:资源总量为100,三个队列对资源的需求分别为20、50、30。

    第一次:100/3=33.33

        queueA:分33.33->多13.33

        queueB:分33.33->少16.67

        queueC:分33.33->多3.33

    第二次:(13.33+3.33)/1=16.66
        queueA:分20
        queueB:分33.33+16.66=50
        queueC:分30

(II)作业资源分配
(a)不加权(关注job个数)(计算时:资源个数/资源需求)
  需求:一个队列有12个资源,4个job,需求分别是1、2、6、5。
    第一次:12/4=3
        job1:分3个->多2个
        job2:分3个->多1个
        job3:分3个->少3个
        job4:分3个->少2个

    第二次:(2+1)/2=1.5
        job1:分1个
        job2:分2个
        job3:分3个->少3个->分1.5个->共分4.5个
        job4:分3个->少2个->分1.5个->共分4.5个

    第n次算:直到没有空闲资源。

(b)加权(关注job权重)(计算时:资源个数/权重)
  需求:一个队列有16个资源,4个job,需求分别:4、2、10、4;权重分别为:5、8、1、2。
    第一次:16/(5+8+1+2)=1
        job1:分1x5个->多5-4=1个
        job2:分1x8个->多8-2=6个
        job3:分1x1个->少10-1=9个
        job4:分1x2个->少4-2=2个

    第二次:(1+6)/(1+2)=7/3
        job1:分4个
        job2:分2个
        job3:分1个->少9个->分(7/3)x1=2.23个->少6.67
        job4:分2个->少2个->分(7/3)x2=4.66个->多2.66

    第三次:2.66/1=2.66
        job1:分4个
        job2:分2个
        job3:分1个->少9个->分(7/3)x1=2.23个->少6.67->分2.66x1个->共分(1+2.33+2.66)=6个
        job4:分2个->少2个->分4个

    第n次算:直到没有空闲资源。

(3)DRF:FIFO和FAIR只考虑单一资源内存,当存在贷款、CPU等资源需要分配时使用DRF进行调度。使用DRF策略对不同应用进行不同资源的不同比例限制。