hadoop调度器概念及区别

@Author  : Spinach | GHB
@Link    : http://blog.csdn.net/bocai8058

概述

Hadoop中常见的调度器有三种,分别为:
FIFO调度器、公平调度器Fair Scheduler、容量调度器Capacity Scheduler(计算能力调度器)

它的作用是将系统中空闲的资源按一定策略分配给作业。在Hadoop中,调度器是一个可插拔的模块,用户可以根据自己的实际应用要求设计调度器。

基本作用和调度器考虑因素

  • Hadoop调度器的基本作用就是根据节点资源(slot)使用情况和作业的要求,将任务调度到各个节点上执行。
  • 考虑因素:
  1. 作业优先级。作业的优先级越高,它能够获取的资源(slot数目)也越多。Hadoop 提供了5种作业优先级,分别为 VERY_HIGH、HIGH、NORMAL、 LOW、VERY_LOW,通过mapreduce.job.priority属性来设置。
  2. 作业提交时间。顾名思义,作业提交的时间越早,就越先执行。
  3. 作业所在队列的资源限制。调度器可以分为多个队列,不同的产品线放到不同的队列里运行。不同的队列可以设置一个边缘限制,这样不同的队列有自己独立的资源,不会出现抢占和滥用资源的情况。

默认FIFO调度器

FIFO是Hadoop中默认的调度器,也是一种批处理调度器。它先按照作业的优先级高低,再按照到达时间的先后选择被执行的作业。原理图如下所示。

比如,一个 TaskTracker 正好有一个空闲的 slot,此时 FIFO 调度器的队列已经排好序,就选择排在最前面的任务 job1,job1 包含很多 map task和reduce task。假如空闲资源是 map slot,我们就选择 job1 中的 map task。假如 map task0 要处理的数据正好存储在该 TaskTracker 节点上,根据数据的本地性,调度器把 map task0 分配给该TaskTracker。FIFO 调度器整体就是这样一个过程。

容量调度器Capacity Scheduler(计算能力调度器)

支持多个队列,每个队列可配置一定的资源量,每个队列采用FIFO调度策略,为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。调度时,首先按以下策略选择一个合适队列:计算每个队列中正在运行的任务数与其应该分得的计算资源之间的比值,选择一个该比值最小的队列;然后按以下策略选择该队列中一个作业:按照作业优先级和提交时间顺序选择,同时考虑用户资源量限制和内存限制。

比如我们分为三个队列:queueA、queueB和queueC,每个队列的 job 按照到达时间排序。假如这里有 100 个slot,queueA 分配 20% 的资源,可配置最多运行 15 个task,queueB 分配 50% 的资源,可配置最多运行 25 个task,queueC 分配 30% 的资源,可配置最多运行 25 个task。这三个队列同时按照任务的先后顺序依次执行,比如,job11、job21和job31分别排在队列最前面,是最先运行,也是同时运行。

公平调度器Fair Scheduler

同计算能力调度器类似,支持多队列多用户,每个队列中的资源量可以配置,同一队列中的作业公平共享队列中所有资源。

比如有三个队列:queueA、queueB和queueC,每个队列中的 job 按照优先级分配资源,优先级越高分配的资源越多,但是每个 job 都会分配到资源以确保公平。在资源有限的情况下,每个 job 理想情况下获得的计算资源与实际获得的计算资源存在一种差距, 这个差距就叫做缺额。在同一个队列中,job的资源缺额越大,越先获得资源优先执行。作业是按照缺额的高低来先后执行的,而且可以看到上图有多个作业同时运行

公平调度器vs容量调度器

  1. 公平调度是以pool为单位分配任务slots的,容量调度以queue的方式分配tasktracker的,当都只有一个job的时候,两种调度器都可以利用整个集群的资源;
  2. 在每个pool内部可以是以FIFO方式调度也可以是公平方式调度,但是在queue内部只能是以FIFO方式调度,这是公平调度和容量调度的一个区别;
  3. 虽然在queue内部可以设置优先级但是并不支持抢占,在pool内部是支持抢占的,就是可以为某个pool(通常是生产上的用户)分配最低的任务slot,当这个pool得不到最低的资源的时候他就会kill其他的job的task以使自己获得最低的资源,这并不会引起其他的job的失败,因为job也是master-slaver的结构,也是容错的。

整体总结:

  1. 公平调度:以pool为单位分配任务;每个内部采用FIFO调度;queue可以设置优先级但不支持抢占;
  2. 容量调度:以queue为单位分配任务;每个内部可以采用FIFO调度也可以采用公平方式调度;pool内部支持抢占;

引用:https://www.cnblogs.com/codeOfLife/p/5418460.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章