Hadoop作业调度器主要有三种:FIFO、容量(Capacity Scheduler)和公平(Fair Scheduler)。
Apache Hadoop默认的资源调度器:容量调度器Capacity Scheduler。
CDH框架默认调度器是Fair Scheduler。
1 FIFO
单队列,先来先服务。
优点:简单易懂;
缺点:不支持多队列,生产环境很少使用。
2 容量调度器
Capacity Scheduler是Yahoo开发的多用户调度器。
特点:
(1)多队列:每个队列配置一定资源,队列中采用FIFO调度策略。
(2)容量保证:可以给每个队列设置资源使用的下限和上限。
(3)灵活性:某一队列的剩余资源可以暂时共享给需要资源的队列,当该队列由新的应用程序提交时,则别的队列归还借调的的资源。
(4)多租户:支持多用户共享集群和多应用程序同时运行。(防止统一用户独占队列资源,调度器会限定同一用户提交的专业所占资源)
容量调度器资源分配算法
(1)队列资源分配:从root开始深度遍历,有选择资源占用率最低的队列进行分配。
(2)作业资源分配:按作业优先级和提交时间分配。
(3)容器资源分配:按容器优先级分配,优先级相同,按照数据本地性原则:
(i)任务和数据在同一节点;
(ii)任务和数据在同一机架;
(iii)任务和数据不在同一节点和同一机架。
3 公平调度器
同队列所有任务共享资源,在时间尺度上获得公平的资源。
(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)任务和数据不在同一节点和同一机架。
实际最小资源份额:minShare=Min(资源需求量,配置的最小资源)
是否饥饿:isNeedy=资源使用量<minShare
资源分配比:minShareRatio=资源使用量/Max(minShare,1)
资源使用权重比:useToWeightRatio=资源使用量/权重
例子:
(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策略对不同应用进行不同资源的不同比例限制。