文档章节

Hadoop 1.x的Shuffle源码分析之1

brian_2017
 brian_2017
发布于 2017/01/17 09:44
字数 489
阅读 23
收藏 0

先参考董西成的博文  http://dongxicheng.org/mapreduce/hadoop-shuffle-phase/   

Hadoop中shuffle阶段流程分析


Hadoop的一个任务执行过程,分为Map和Reduce两个阶段。而shuffle发生在Reducer阶段。Hadoop 1.2.1里,Reduce类的源码在org.apache.hadoop.mapreduce包的Reducer.java文件,这里有一份详细的reduce过程的解释。shuffle是reduce的第一个阶段,以http的方式从map任务的输出获取数据。reduce的第二个阶段是sort,根据key对来reducer的输入进行排序,因为不同的map任务可能会产生相同key的输出。reducer的第三个阶段就是做最终处理,根据Reducer的reduce函数处理数据。


Reducer类只是提供了一个可Override的reduce函数,Shuffle实际上在ReduceTask类执行。ReduceTask类在org.apache.hadoop.mapred包里。


ReduceTask类比较复杂,有7个内嵌类,有些内嵌类里也有自己的内嵌类,毕其功于一役的做法。它的主要代码在run函数执行:

这是reduce的三个阶段:

if (isMapOrReduce()) {
      copyPhase = getProgress().addPhase("copy");
      sortPhase  = getProgress().addPhase("sort");
      reducePhase = getProgress().addPhase("reduce");
    }

shuffle阶段在这里

reduceCopier = new ReduceCopier(umbilical, job, reporter);
      if (!reduceCopier.fetchOutputs()) {
        if(reduceCopier.mergeThrowable instanceof FSError) {
          throw (FSError)reduceCopier.mergeThrowable;
        }
        throw new IOException("Task: " + getTaskID() + 
            " - The reduce copier failed", reduceCopier.mergeThrowable);
      }


fetchOutputs函数接近400行,比较长,略坑,在这个函数,

copiers = new ArrayList<MapOutputCopier>(numCopiers);


创建了一组 MapOutputCopier,它是个线程类,负责取数据。

//start the on-disk-merge thread
      localFSMergerThread = new LocalFSMerger((LocalFileSystem)localFileSys);
      //start the in memory merger thread
      inMemFSMergeThread = new InMemFSMergeThread();
      localFSMergerThread.start();
      inMemFSMergeThread.start();
      
      // start the map events thread
      getMapEventsThread = new GetMapEventsThread();
      getMapEventsThread.start();

再创建几个线程,有的负责取map任务的信息,有的负责对结果做归并。


继续往下,是一个while循环,这个循环处理取数据,有一百多行代码,当数据取完或者达到失败上限就终止循环。


循环结束后,依次终止 获取map事件线程, 取数据线程,shuffl内存管理线程,排序线程,至此shuffle就结束了。

© 著作权归作者所有

brian_2017
粉丝 3
博文 61
码字总数 145216
作品 0
私信 提问
面试问题

358、你们的集群规模? 开发集群:10台(8台可用)8核cpu 359、你们的数据是用什么导入到数据库的?导入到什么数据库? 处理之前的导入:通过hadoop命令导入到hdfs文件系统 处理完成之后的导...

HIVE
2016/07/05
1K
2
Apache Hadoop 2.2.0 稳定版发布

Apache Hadoop 2.2.0 稳定版发布了,建议用户升级。该版本更加稳定,同时在 API 和协议上兼容老的版本。 与 Hadoop 1.x 比较,该版本显著的改进包括: YARN - A general purpose resource ma...

潞邊壹仦貓
2013/10/16
13K
22
Yarn在Shuffle阶段内存不足问题(error in shuffle in fetcher)

最近在使用MR跑一个任务的时候shuffle阶段出现OOM,这个问题之前从来没有遇到过,上网找了一下,发现网友也遇到过想似的问题,以下是转载的该问题的解决方法: 原文地址:http://blog.csdn....

纳兰清风
2016/12/15
853
0
零基础学习hadoop到上手工作线路指导(中级篇)

此篇是在零基础学习hadoop到上手工作线路指导(初级篇)的基础,一个继续总结。 五一假期:在写点内容,也算是总结。上面我们会了基本的编程,我们需要对hadoop有一个更深的理解: hadoop分为...

一枚Sir
2014/08/07
138
0
一篇文章了解 Spark Shuffle 内存使用

在使用 Spark 进行计算时,我们经常会碰到作业 (Job) Out Of Memory(OOM) 的情况,而且很大一部分情况是发生在 Shuffle 阶段。那么在 Spark Shuffle 中具体是哪些地方会使用比较多的内存而有...

Spark
03/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
5
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
昨天
4
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
7
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部