Hadoop on Mac with IntelliJ IDEA - 10 陆喜恒. Hadoop实战(第2版)6.4.1(Shuffle和排序)Map端 内容整理

下午对着源码看陆喜恒. Hadoop实战(第2版)6.4.1  (Shuffle和排序)Map端,发现与Hadoop 1.2.1的源码有些出入。下面作个简单的记录,方便起见,引用自书本的语句都用斜体表示

依书本,从MapTask.java开始。这个类有多个内部类:

从书的描述可知,collect()并不在MapTask类,而在MapOutputBuffer类,其函数功能是

1、定义输出内存缓冲区为环形结构
2、定义输出内存缓冲区内容到磁盘的操作

在collect函数中将缓冲区的内容写出时会调用sortAndSpill函数。好了,从这里开始就开始糊涂了,因为collect()没调用这个函数,接触Hadoop也就几天时间,啥都不懂,一下晕了。

简单表示下当前的函数调用关系:

0 ---- MapOutputBuffer::collect()

达到写出阈值后,写了缓冲区内容,形成spill文件。即,调用了startSpill()。

0 ---- MapOutputBuffer::collect()

1 -------- startSpill()

startSpill()触发了条件:spillReady.signal()。字段spillReady在spillReady在SpillThread类中用到,SpillThread为Thread的子类,其run方法有如下内容:

SpillThread::run()
    // ...
    spillReady.await();
    // ...
    MapOutputBuffer::sortAndSpill()
    // ...

那么,这里第一次看到sortAndSpill方法被调用,接上了书本的描述。现在主要函数调用关系如下

线程1 线程2(MapOutputBuffer构造函数中启动)

0 ---- MapOutputBuffer::collect()

1 -------- startSpill()

2 ------------ spillReady.signal()


SpillThread::run()
  // ...
  spillReady.await();
  // ...
  MapOutputBuffer::sortAndSpill()
  // ...

sortAndSpill内部使用了快排:

...
sorter = ReflectionUtils.newInstance(
                                job.getClass(
                        "map.sort.class",
                        QuickSort.class,
                        IndexedSorter.class),
                        job);
...
sorter.sort();
...

排序后,判断combinerRunner是否为空,为空直接写入spill,否则调用combinerRunner.combine方法,再不是combineAndSpill方法,Hadoop 1.2.1源码中没书上写的这句代码。combinerRunner在MapOutputBuffer的构造函数中定义

combinerRunner = CombinerRunner.create(job, getTaskID(),
                                             combineInputCounter,
                                             reporter, null);

sortAndSpill()另一个调用者是flush(),此函数是MapOutputBuffer成员。这段代码位于

MapTask::run()

  runOldMapper()

    collector = new MapOutputBuffer(umbilical, job, reporter);

    ...

    collector.flush()

      sortAndSpill()

      mergeParts()

done(umbilical, reporter)

上述的调用关系才符合书第112页最后一段的描述。mergeParts()执行合并操作,这个操作的主要目的是将Map生成的众多spill文件中的数据按照划分重新组织,以便于Reduce处理。这里的划分,应该是partition之意。

待唯一的已分区且排序的Map输出文件写入最后一条记录后,Map端的shuffle阶段就结束了。从源码看,这步应该是执行done(umbilical, reporter)后才完成。

╮(╯_╰)╭  我不是为了情怀,我就是认真。

时间: 2024-08-05 14:00:28

Hadoop on Mac with IntelliJ IDEA - 10 陆喜恒. Hadoop实战(第2版)6.4.1(Shuffle和排序)Map端 内容整理的相关文章

Hadoop on Mac with IntelliJ IDEA - 9 解决Type mismatch in value from map问题

修改陆喜恒. Hadoop实战(第2版)5.3排序的代码时遇到IO异常. 环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.5, Hadoop 1.2.1 异常具体信息如下 1 14/10/06 03:08:51 INFO mapred.JobClient: Task Id : attempt_201410021756_0043_m_000000_0, Status : FAILED 2 java.io.IOException: Type mismatch in va

Hadoop on Mac with IntelliJ IDEA - 8 单表关联NullPointerException

简化陆喜恒. Hadoop实战(第2版)5.4单表关联的代码时遇到空指向异常,经分析是逻辑问题,在此做个记录. 环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.5, Hadoop 1.2.1 改好的代码如下,在reduce阶段遇到了NullPointerException. 1 public class STjoinEx { 2 private static final String TIMES = "TIMES"; 3 4 public static v

Hadoop on Mac with IntelliJ IDEA - 7 解决failed to report status for 600 seconds. Killing!问题

本文讲述作业在Hadoop 1.2.1完成map后ruduce阶段遇到failed to report status for 600 seconds. Killing!问题的解决过程. 环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.4, Hadoop 1.2.1 Hadoop放在虚拟机中,宿主机通过SSH连接,IDE和数据文件在宿主机.IDEA自身运行于JDK 1.8,IDEA工程及Hadoop使用JDK 1.6. 提交作业到hadoop后,作业执行时间过长,输出

hadoop核心逻辑shuffle代码分析-map端

首先要推荐一下:http://www.alidata.org/archives/1470 阿里的大牛在上面的文章中比较详细的介绍了shuffle过程中mapper和reduce的每个过程,强烈推荐先读一下. 不过,上文没有写明一些实现的细节,比如:spill的过程,mapper生成文件的 partition是怎么做的等等,相信有很多人跟我一样在看了上面的文章后还是有很多疑问,我也是带着疑问花了很久的看了cdh4.1.0版本 shuffle的逻辑,整理成本文,为以后回顾所用. 首先用一张图展示下m

Hadoop on Mac with IntelliJ IDEA - 5 解决java heap space问题

本文讲述在CentOS 6.5中提交作业到hadoop 1.2.1于reduce阶段遇到Error: java heap space错误导致作业重新计算的解决过程.解决办法适用Linux.Mac OS X 和Windows操作系统. 环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.4, Hadoop 1.2.1 Hadoop放在虚拟机中,宿主机通过SSH连接,IDE和数据文件在宿主机.IDEA自身运行于JDK 1.8,IDEA工程及Hadoop使用JDK 1.6.

Hadoop on Mac with IntelliJ IDEA: 1 解决输入路径不存在问题

本文讲述使用IntelliJ IDEA时遇到Hadoop提示input path does not exist(输入路径不存在)的一种解决办法. 环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.4, Hadoop 1.2.1 Hadoop放在虚拟机中,宿主机通过SSH连接,IDE和数据文件在宿主机. 这是自学Hadoop的第三天.以前做过点.NET开发,Mac.IntelliJ IDEA.Hadoop.CentOS对我而言,相当陌生.第一份Hadoop代码就遇到了问

Hadoop on Mac with IntelliJ IDEA - 4 制作jar包

本文讲述使用IntelliJ IDEA打包Project的过程,即,打jar包. 环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.4, Hadoop 1.2.1 Hadoop放在虚拟机中,宿主机通过SSH连接,IDE和数据文件在宿主机.IDEA自身运行于JDK 1.8,IDEA工程及Hadoop使用JDK 1.6. 在本系列博文的第一篇,我因不会使用IDEA打jar包,不得不直接调试代码,遇到输入路径不存在问题.今天,我打了几次jar包,结果不都满意,默认情况,ID

Hadoop on Mac with IntelliJ IDEA - 2 解决URI错误导致Permission denied

本文讲述在IntelliJ IDEA中使用FileSystem.copyFromLocalFile操作Hadoop时因URI格式有误导致Permission denied的解决过程. 环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.4, Hadoop 1.2.1 Hadoop放在虚拟机中,宿主机通过SSH连接,IDE和数据文件在宿主机. 操作代码如下 1 public class CopyFromLocalTestDriver { 2 public static v

Hadoop on Mac with IntelliJ IDEA - 6 解决KeyValueTextInputFormat读取时只有key值问题

本文讲述使用KeyValueTextInputFormat在Hadoop 0.x正常工作.Hadoop 1.2.1失效的解决过程. 环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.4, Hadoop 1.2.1 Hadoop放在虚拟机中,宿主机通过SSH连接,IDE和数据文件在宿主机.IDEA自身运行于JDK 1.8,IDEA工程及Hadoop使用JDK 1.6. 还在折腾Hadoop In Action第4章的代码,书的写法,如下所示. job.setInputF