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

1、调度器基本作用

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

2、调度器考虑的因素

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

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

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

3、调度器原理

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

  

  在上图中,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 中默认的调度器,也是一种批处理调度器。它先按照作业的优先级高低,再按照到达时间的先后选择被执行的作业。原理图如下所示。

  

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

  

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

  3、公平调度器(Fair Scheduler)

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

  

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

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

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

Hadoop作业调度器的更多相关文章

  1. Hadoop资源调度器

    hadoop调度器的作用是将系统中空闲的资源按一定策略分配给作业.调度器是一个可插拔的模块,用户可以根据自己的实际应用要求设计调度器.Hadoop中常见的调度器有三种,分别为: 1.基于队列的FIFO ...

  2. 在springMVC框架中集成quartz作业调度器

    1.首先需要导入这几个jar包,如下图: 其中log4j,quartz,slf4j-api,slf4j-log4j12我是在项目中都引用了 2.引用完jar包后,新建一个作业调度类,执行作业调度逻辑, ...

  3. 基于Quartz.NET构建自己的动态作业调度器

    在日常的开发中,运行定时任务基本上已经是很普遍的需求了,可以通过windows服务+timer组件来实现,也可以使用第三方框架来集成,Quartz.NET就是一款从JAVA的Quartz移植过来的一个 ...

  4. 初识 .NET平台下作业调度器——Quartz.NET

    Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不牺牲 ...

  5. Hadoop实战之二~ hadoop作业调度详解(1)

    对Hadoop的最感兴趣的地方,也就在于Hadoop的作业调度了,在正式介绍如何搭建Hadoop之前,深入理解一下Hadoop的作业调度很有必要.我们不一定能用得上Hadoop,但是如果理通顺Hado ...

  6. Elastic-Job-Lite分析——作业调度器 JobScheduler 的创建过程

    -----------------------------------1. 创建注册中心的对象----------------------------------------------------- ...

  7. Hadoop实战之四~hadoop作业调度详解(2)

    这篇文章将接着上一篇wordcount的例子,抽象出最简单的过程,一探MapReduce的运算过程中,其系统调度到底是如何运作的. 情况一:数据和运算分开的情况 wordcount这个例子的是hado ...

  8. Hadoop调度器

    一.FIFO调度器(先进先出调度) 上图为FIFO调度器的执行过程示意图.FIFO Scheduler是最简单也是最容易理解的调度器,它缺点是不适用于共享集群.大的应用可能会占用所有集群资源,这就导致 ...

  9. Linux 作业调度器 crond

    linux缺省会启动crond进程,crond进程不需要用户启动.关闭.  需要启动/关闭cron /sbin/service crond start --启动服务 /sbin/service cro ...

随机推荐

  1. bcov进行覆盖率统计

    kcov是在bcov基础上进行的,bcov已经很久没有维护了: 首先需要下载依赖库libdwraft,然后在configure时候进行指定: ./configure --with-libdwarf=/ ...

  2. 添加三维动画 demo

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...

  3. codevs 1557 热浪

    传送门 题目描述 Description 德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品.Farmer John此时以先天 ...

  4. webserver<1>

    1. 实现基础的信号处理 sigaction使用前一定内存清零 2. 实现基础的进程模型 wait 等待子进程结束 #include <stdio.h> #include <unis ...

  5. 测试一下MarkDown

    欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接 ...

  6. keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法

    以前写单片机程序时总是把所用函数和变量都写在一个c文件里,后来遇到大点的项目,程序动则几千行,这种方式无疑会带来N多麻烦,相信大家都有所体验吧! 后来学会了在keil里进行模块化编程,即只把功能相同或 ...

  7. Scarborough Fair 绝美天籁

    很少见的男声唱法,而且还古色古香: https://www.youtube.com/watch?v=sgbo2QWLBzI https://www.youtube.com/watch?v=-BakWV ...

  8. 改进的sqlhelper学习日志

    下面就是详细的sqlhelper的代码了 using System; using System.Collections.Generic; using System.Linq; using System ...

  9. 删除N 中 所有的 x

    //删除N 中 所有的 x #include <stdio.h> #define N 10 int f(int a[],int n,int x) { int i ,j=0; for(i=0 ...

  10. poj 2479 Maximum sum (最大字段和的变形)

    题目链接:http://poj.org/problem?id=2479 #include<cstdio> #include<cstring> #include<iostr ...