Hadoop作业调度器

  随着 MapReduce 的流行,其开源实现 Hadoop 也变得越来越受推崇。在 Hadoop 系统中,有一个组件非常重要,那就是调度器。调度器是一个可插拔的模块,用户可以根据自己的实际应用要求设计调度器

1、调度器基本作用

  Hadoop调度器的基本作用就是根据节点资源(slot)使用情况和作业的要求,将任务调度到各个节点上执行

2、调度器考虑的因素

  1、作业优先级。作业的优先级越高,它能够获取的资源(slot数目)也越多。Hadoop 提供了5种作业优先级,分别为 VERY_HIGH、HIGH、NORMAL、 LOW、VERY_LOW,通过mapreduce.job.priority属性来设置。

  2、作业提交时间。顾名思义,作业提交的时间越早,就越先执行。

  3、作业所在队列的资源限制。调度器可以分为多个队列,不同的产品线放到不同的队列里运行。不同的队列可以设置一个边缘限制,这样不同的队列有自己独立的资源,不会出现抢占和滥用资源的情况

3、调度器原理

  任务调度器的原理是怎么样的?我们来先看一下任务调度原理图,如下所示

  Hadoop作业调度器 

  在上图中,TaskScheduler 是 JobTracker 的一个组件、一个成员,它们之间是函数与调用的关系。而 Client、JobTracker和TaskTracker之间是通过网络RPC来交互。下面我们就来分析调度器的大致原理。

  1、Client 通过submitJob()函数向JobTracker提交一个作业。

  2、JobTracker通知 TaskScheduler,调用其内部函数initJob()对这个作业进行初始化,创建一些内部的数据结构。

  3、TaskTracker 通过心跳来向 JobTracker 汇报它的资源情况,比如有多少个空闲的map slot和reduce slot。

  4、如果 JobTracker 发现第一个 TaskTracker 有空闲的资源 ,JobTracker 就会调用 TaskScheduler 的 assignTasks() 函数,返回一些task list给第一个TaskTracker。 这时TaskTracker就会执行调度器分配的任务

4、Hadoop自带调度器

  目前,Hadoop 作业调度器主要有三种:FIFO、Capacity Scheduler和Fair Scheduler。下面我们分别介绍。

  1、先进先出调度器(FIFO)

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

  Hadoop作业调度器

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

  2、 容量调度器(Capacity Scheduler)

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

  Hadoop作业调度器

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

  3、公平调度器(Fair Scheduler)

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

  Hadoop作业调度器

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

如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
如果,您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是【刘超★ljc】。

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。