角色描述:
JobClient:执行任务的客户端
JobTracker:任务调度器
TaskTracker:任务跟踪器
Task:具体的任务(Map OR Reduce)

从生命周期的角度来看,mapreduce流程大概经历这样几个阶段:初始化、分配、执行、反馈、成功与失败的后续处理

每个阶段所做的事情大致如下

任务初始化

1.JobClient对数据源进行切片
切片信息由InputSplit对象封装,接口定义如下:

  1. public interface InputSplit extends Writable {
  2. long getLength() throws IOException;
  3. String[] getLocations() throws IOException;
  4. }

可以看到split并不包含具体的数据信息,而只是包含数据的引用,map任务会根据引用地址去加载数据
InputSplit是由InputFormat来负责创建的

  1. public interface InputFormat<K, V> {
  2. InputSplit[] getSplits(JobConf job, int numSplits) throws IOException;
  3. RecordReader<K, V> getRecordReader(InputSplit split,JobConf job,Reporter reporter) throws IOException;
  4. }

JobClient通过getSplits方法来计算切片信息,切片默认大小和HDFS的块大小相同(64M),这样有利于map任务的本地化执行,无需通过网络传递数据
切片成功后,JobClient会将切片信息传送至JobTracker
2.通过jobTracker生成jobId
    JobTracker.getNewJobId()
3.检查输出目录和输入数据源是否存在
    输出目录已存在,系统抛出异常
    输入源目录不存在,系统抛出异常
4.拷贝任务资源到jobTracker机器上(封装任务的jar包、集群配置文件、输入源切片信息)

任务分配

JobTracker遍历每一个InputSplit,根据其记录的引用地址选择距离最近的TaskTracker去执行,理想情况下切片信息就在TaskTracker的本地,这样节省了网络数据传输的时间
JobTracker和TaskTracker之间是有心跳通信的逻辑的,通过彼此间不停的通信,JobTracker可以判断出哪些TaskTracker正在执行任务,哪些TaskTracker处于空闲状态,以此来合理分配任务

任务执行

TaskTracker接到任务后开始执行如下操作:
1.将任务jar包从HDFS拷贝到本地并进行解压
2.TaskTracker 为每个 Task 启动一个独立的 JVM 以避免不同 Task 在运行过程中相互影响

如果所执行的任务是map任务,则处理流程大致如下:
首先加载InputSplit记录的数据源切片,通过InputFormat的getRecordReader()方法
获取到Reader后,执行如下操作:

  1. K key = reader.createKey();
  2. V value = reader.createValue();
  3. while (reader.next(key, value)) {//遍历split中的每一条记录,执行map功能函数
  4. mapper.map(key, value, output, reporter);
  5. }

执行反馈

mapreduce的执行是一个漫长的过程,执行期间会将任务的进度反馈给用户
任务结束后,控制台会打印Counter信息,方便用户以全局的视角来审查任务

执行成功

清理MapReduce本地存储(mapred.local.dir属性指定的目录)
清理map任务的输出文件

执行失败

1.如果task出现问题(map或者reduce)
错误可能原因:用户代码出现异常;任务超过mapred.task.timeout指定的时间依然没有返回
错误处理:
首先将错误信息写入日志
然后jobtracker会调度其他tasktracker来重新执行次任务,如果失败次数超过4次(通过mapred.map.max.attempts和mapred.reduce.max.attempts属性来设置,默认为4),则job以失败告终
如果系统不想以这种方式结束退出,而是想通过Task成功数的百分比来决定job是否通过,则可以指定如下两个属性
mapred.max.map.failures.percent            map任务最大失败率
mapred.max.reduce.failures.percent        reduce任务最大失败率
如果失败比率超过指定的值,则job以失败告终

2.如果是tasktracker出现问题
判断问题的依据:和jobtracker不再心跳通信
jobtracker将该tasktracker从资源池中移除,以后不在调度它

3.jobtracker出现问题
jobtracker作为系统的单点如果出现问题也是最为严重的问题,系统将处于瘫痪

mapreduce执行流程的更多相关文章

  1. MapReduce执行流程及程序编写

    MapReduce 一种分布式计算模型,解决海量数据的计算问题,MapReduce将计算过程抽象成两个函数 Map(映射):对一些独立元素(拆分后的小块)组成的列表的每一个元素进行指定的操作,可以高度 ...

  2. 016_笼统概述MapReduce执行流程结合wordcount程序

    数据传输<key,value>     File-->  <key,value>  -->map(key,value)  --> mapResult<k ...

  3. 2.25-2.26 MapReduce执行流程Shuffle讲解

    原文链接:https://langyu.iteye.com/blog/992916 Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapReduce, Shuffle是 ...

  4. MapReduce架构与执行流程

    一.MapReduce是用于解决什么问题的? 每一种技术的出现都是用来解决实际问题的,否则必将是昙花一现,那么MapReduce是用来解决什么实际的业务呢? 首先来看一下MapReduce官方定义: ...

  5. [Hadoop]浅谈MapReduce原理及执行流程

    MapReduce MapReduce原理非常重要,hive与spark都是基于MR原理 MapReduce采用多进程,方便对每个任务资源控制和调配,但是进程消耗更多的启动时间,因此MR时效性不高.适 ...

  6. MapReduce作业的执行流程

    MapReduce任务执行总流程 一个MapReduce作业的执行流程是:代码编写 -> 作业配置 -> 作业提交 -> Map任务的分配和执行 -> 处理中间结果 -> ...

  7. Hadoop MapReduce执行过程详解(带hadoop例子)

    https://my.oschina.net/itblog/blog/275294 摘要: 本文通过一个例子,详细介绍Hadoop 的 MapReduce过程. 分析MapReduce执行过程 Map ...

  8. Mapreduce执行过程分析(基于Hadoop2.4)——(二)

    4.3 Map类 创建Map类和map函数,map函数是org.apache.hadoop.mapreduce.Mapper类中的定义的,当处理每一个键值对的时候,都要调用一次map方法,用户需要覆写 ...

  9. MapReduce执行过程源码分析(一)——Job任务的提交

    为了能使源码的执行过程与Hadoop权威指南(2.3版)中章节Shuffle and Sort的分析相对应,Hadoop的版本为0.20.2. 一般情况下我们通过Job(org.apache.hado ...

随机推荐

  1. as3 中 textfiled的htmltext 的常用属性

    http://blog.sina.com.cn/s/blog_6d193c030100x6ud.html <a> 超链接标签 属性:href: 链接地址 target: 目标窗口 可取值为 ...

  2. vsftp虚拟用户配置

    找了很久,终于找到像样一点的文章,很详细,参数方面懂英文基本能看懂,一个教程是否有用,关键在于细节.错了一点点就不能配下去了. ------------------------------------ ...

  3. 异构平台同步(Mysql到Oracle)

    Oracle GoldenGate学习之--异构平台同步(MySQL到Oracle) 如图所示:源端采用Mysql库,目标端采用Oracle库 一.OGG安装配置(源端) 1.OGG下载 https: ...

  4. jQuery-vsdoc.js文件是vs中的JavaScript intellisense,

    在VS 2008中启用jQuery Intellisense的步骤 要在VS中启用jQuery的intellisense完成,你要遵循三个步骤: 第一步: 安装VS 2008 SP1 VS 2008 ...

  5. 06-Java 本地文件操作

    1.File类简介 创建好:File file=new File("hello.txt"); 后,按住Ctrl键.单击File.会出现File的源代码. 在视图左下角双击" ...

  6. (委托事件处理)关于多线程执行显示进度条的实例(转)&&线程间操作无效: 从不是创建控件“rtxtEntryNO”的线程访问它。

    关于多线程执行显示进度条的实例! 之前回答了一篇关于怎么在线程中操作进度条的帖子,估计有人看的不是很明白今天没事,写了一个小小的实例,很简单,就2个文件权当抛砖引玉,希望有更好解决方案的人发表一下意见 ...

  7. Show a heart shaped

    Windows Form application version: private void Form1_Load(object sender, EventArgs e)        {       ...

  8. Hadoop数据传输工具:Sqoop

    Apache Sqoop(SQL-to-Hadoop) 项目旨在协助 RDBMS 与 Hadoop 之间进行高效的大数据交流.用户可以在 Sqoop 的帮助下,轻松地把关系型数据库的数据导入到 Had ...

  9. Why doesn't Genymotion run on Windows 10?

    To date, VirtualBox is not yet fully compatible with Windows 10. As Genymotion relies on the use of ...

  10. Android 网络编程 Socket

    1.服务端开发 创建一个Java程序 public class MyServer { // 定义保存所有的Socket,与客户端建立连接得到一个Socket public static List< ...