在Hadoop中,我们可以通过Job对象的submit()方法来运行MapReduce作业,也可以调用waitForCompletion()用于提交以前没有提交过的作业,并等待它的完成。其中,submit()方法调用封装了大量的处理细节,如下图所示:

   

在最高层,有5个独立的实体。

客户端,提交MapReduce作业;

YARN资源管理器,负责协调集群上计算机资源的分配;

YARN节点管理器,负责启动和监视集群中机器上的计算容器(container);

MapReduce的application master,负责协调运行MapReduce作业的任务,它和MapReduce任务在容器中运行,这些容器由资源管理器分配并由节点管理器进行管理;

分布式文件系统(一般为HDFS),用来与其他实体间共享作业文件。

1 作业的提交

Job的submit()方法创建一个内部的JobSummiter实例,并且调用其submitJobInternal()方法。提交作业后,waitForCompletion()每秒轮询作业的进度,如果发现自上次报告后有改变,便把进度报告到控制台。作业完成后,如果成功,就显示作业计数器;如果失败,则导致作业失败的错误被记录到控制台。

JobSummiter所实现的作业提交过程如下:

① 向资源管理器请求爱一个新应用ID,用于MapReduce作业ID;

② 检查作业的输出说明;

③ 计算作业的输入分片;

④ 将运行作业所需要的资源(包括作业JAR文件、配置文件和计算所得的输入分片)复制到一个以作业ID命名的目录下的共享文件系统中;

⑤ 通过调用资源管理器的submitApplication()方法提交作业。

2 作业的初始化

资源管理器收到调用它的submitApplication()消息后,便将请求传递给YARN调度器。调度器分配一个容器,然后资源管理器在节点管理器的管理下载容器中启动application master的进程。

MapReduce作业的application master是一个Java应用程序,它的主类是MRAppMaster。由于将接受来自任务的进度和完成报告,因此application master对作业的初始化是通过创建多个簿记对象以保持对作业进度的跟踪来完成的。

接下来,它接受来自共享文件系统的、在客户端计算的输入分片。然后对每一个分片创建一个map任务对象以及由mapreduce.job.reduces属性确定的多个reduce任务对象。任务ID在此时分配。

最后,在任何任务运行之前,application master调用setupJob()方法设置OutputCommitter。

3 任务的分配

application master为不适合作为uber运行的作业中的所有map任务和reduce任务向资源管理器请求容器。首先为Map任务发出请求,该请求优先级要高于reduce任务的请求,这是因为所有的map任务必须在reduce的排序阶段能够启动前完成。直到有5%的map任务已经完成时,为reduce任务的请求才会发出。

reduce任务能够在集群中运行,但是map任务的请求有着数据本地化局限。

4 任务的执行

一旦资源管理器的调度器为任务分配了一个特定节点上的容器,application master就通过与节点管理器通信来启动容器。该任务由主类为YarnChild的一个Java应用程序执行。在它运行任务之前,首先将任务需要的资源本地化,包括作业的配置、JAR文件和所有来自分布式缓存的文件。最后,运行map任务或reduce任务。

5 进度和状态的更新

一个作业和它的每个任务都有一个状态,包括:作业或任务的状态、map和reduce的进度作业计数器的值、状态消息或描述。

任务在运行时,对其进度保持追踪。对map任务,任务进度是已处理输入所占的比例。对reduce任务,系统会估计已处理reduce输入的比例,整个过程分成三部分,与shuffle的三个阶段相对应(复制、排序、执行)。

任务也有一组计数器,负责对任务运行过程中各个事件进行计数。当map任务或reduce任务运行时,子进程和父application master通过umbilical接口通信。每隔3秒钟,任务通过这个umbilical接口向自己的application master报告进度和状态,application master会形成一个作业的汇聚视图。

6 作业的完成

当application master收到最后一个任务已完成的通知后,便把作业的状态设置为“成功”。然后,在Job轮询状态时,便知道任务已成功完成,于是Job打印一条消息告知用户,然后从waitForCompletion()方法返回。Job的统计信息和计数值也是在这个时候输出到控制台。

最后,作业完成时,application master和任务容器清理其工作状态,OutputCommitter的commitJob()方法会被调用。

MapReduce作业的工作原理的更多相关文章

  1. MapReduce框架原理-OutputFormat工作原理

    OutputFormat概述 OutputFormat主要是用来指定MR程序的最终的输出数据格式 . 默认使用的是TextOutputFormat,默认是将数据一行写一条数据,并且把数据放到指定的输出 ...

  2. 经典MapReduce作业和Yarn上MapReduce作业运行机制

    一.经典MapReduce的作业运行机制 如下图是经典MapReduce作业的工作原理: 1.1 经典MapReduce作业的实体 经典MapReduce作业运行过程包含的实体: 客户端,提交MapR ...

  3. MapReduce程序的工作过程

    转自:http://www.aboutyun.com/thread-15494-1-2.html 问题导读1.HDFS框架组成是什么?2.HDFS文件的读写过程是什么?3.MapReduce框架组成是 ...

  4. Java --本地提交MapReduce作业至集群☞实现 Word Count

    还是那句话,看别人写的的总是觉得心累,代码一贴,一打包,扔到Hadoop上跑一遍就完事了????写个测试样例程序(MapReduce中的Hello World)还要这么麻烦!!!?,还本地打Jar包, ...

  5. MapReduce on Yarn运行原理

    一.概念综述 MapReduce是一种可用于数据处理的编程模型(或计算模型),该模型可以比较简单,但想写出有用的程序却不太容易.MapReduce能将大型数据处理任务分解成很多单个的.可以在服务器集群 ...

  6. MapReduce工作原理图文详解

    目录:1.MapReduce作业运行流程2.Map.Reduce任务中Shuffle和排序的过程 1.MapReduce作业运行流程 流程示意图: 流程分析: 1.在客户端启动一个作业. 2.向Job ...

  7. MapReduce工作原理讲解

    第一部分:MapReduce工作原理 MapReduce 角色•Client :作业提交发起者.•JobTracker: 初始化作业,分配作业,与TaskTracker通信,协调整个作业.•TaskT ...

  8. MapReduce工作原理

    第一部分:MapReduce工作原理   MapReduce 角色•Client :作业提交发起者.•JobTracker: 初始化作业,分配作业,与TaskTracker通信,协调整个作业.•Tas ...

  9. MapReduce工作原理图文详解 (炼数成金)

    MapReduce工作原理图文详解 1.Map-Reduce 工作机制剖析图: 1.首先,第一步,我们先编写好我们的map-reduce程序,然后在一个client 节点里面进行提交.(一般来说可以在 ...

随机推荐

  1. ZT Linux可用的最新版本的sublime text注册

    更改hosts:sudo vim /private/etc/hosts 127.0.0.1 www.sublimetext.com 127.0.0.1 license.sublimehq.com 1 ...

  2. Java 8 Lambda 表达式(二)

    lambdas 实现 Runnable 接口 下面是使用 lambdas 来实现 Runnable 接口的示例: // 1.1使用匿名内部类 new Thread(new Runnable() { @ ...

  3. Feign源码解析系列-那些注解们

    开始 Feign在Spring Cloud体系中被整合进来作为web service客户端,使用HTTP请求远程服务时能就像调用本地方法,可见在未来一段时间内,大多数Spring Cloud架构的微服 ...

  4. wireshark 无线抓包

    1)抓取无线网卡的数据包(类似有线,仅抓取本网卡的数据包,适用与windows,linux) 1.  打开菜单项“Capture”下的子菜单“Capture Options”选项: 2.  找到设置面 ...

  5. webpack根据开发与生产环境配置不同变量--webpack.DefinePlugin

    webpack有一个DefinePlugin接口,可以实现根据开发与生产环境配置不同变量.范例如下: 需求:开发环境请求baseUrl = '':生产环境请求 baseUrl = 'http://lo ...

  6. 十个有意思的Github Page

    1. Cooolis.github.io Cooolis是一个操作系统命令技巧备忘录 2. rfrd-tw.github.io 2018 台灣公投視覺化 3. confpad.github.io Co ...

  7. InstallShield 软件打包完整教程(含添加自定义依赖环境)

    任务说明:公司一个绿色版的软件,为安装部署是需要很多的环境依赖,如 DevExpress..net4.5.WinRAR等,客户提出安装复杂,并且有漏装后无法启动等情况,现将绿色版转安装版,并将依赖环境 ...

  8. PCP

    1, What is PCP?Prior Comparable Period2, Why needs PCP?This is to compare the value with history val ...

  9. s21day21 python笔记

    s21day21 python笔记 一.内容回顾及补充 内置函数补充 type():查看数据类型 class Foo: pass obj = Foo() if type(obj) == Foo: pr ...

  10. JVM垃圾收集器-ParNew收集器

    今天我给大家讲讲ParNew收集器. ParNew收集器 ParNew收集器收集器其实就是Serial收集器的多线程版本,除了使用多线程进行垃圾收集之外,其余行为包括Serial收集器可用的所有控制参 ...