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在SpillThread类中用到,SpillThread为Thread的子类,其run方法有如下内容:
SpillThread::run()
// ...
spillReady.await();
// ...
MapOutputBuffer::sortAndSpill()
// ...
那么,这里第一次看到sortAndSpill方法被调用,接上了书本的描述。现在主要函数调用关系如下
| 线程1 | 线程2(MapOutputBuffer构造函数中启动) |
|
0 ---- MapOutputBuffer::collect() 1 -------- startSpill() 2 ------------ spillReady.signal() |
SpillThread::run() |
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)后才完成。
╮(╯_╰)╭ 我不是为了情怀,我就是认真。
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 异常具体信息如下 ...
- Hadoop on Mac with IntelliJ IDEA - 8 单表关联NullPointerException
简化陆喜恒. Hadoop实战(第2版)5.4单表关联的代码时遇到空指向异常,经分析是逻辑问题,在此做个记录. 环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.5, Ha ...
- 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 ...
- 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 ...
- Hadoop on Mac with IntelliJ IDEA - 1 解决input path does not exist问题
本文讲述使用IntelliJ IDEA时遇到Hadoop提示input path does not exist(输入路径不存在)的解决过程. 环境:Mac OS X 10.9.5, IntelliJ ...
- 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 ...
- 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 Hado ...
- Hadoop on Mac with IntelliJ IDEA - 3 解决MRUnit - No applicable class implementing Serialization问题
本文讲述在IntelliJ IDEA中使用MRUnit 1.0.0测试Mapper派生类时因MapDriver.withInput(final K1 key, final V1 val)的key参数被 ...
- Hadoop on Mac with IntelliJ IDEA - 2 解决URI错误导致Permission denied
本文讲述在IntelliJ IDEA中使用FileSystem.copyFromLocalFile操作Hadoop时因URI格式有误导致Permission denied的解决过程. 环境:Mac O ...
随机推荐
- OpenLayers调用arcgis server发布的地图服务
有两种方式可以调用arcgis server发布的地图服务,一种是rest,一种是wms. 地图的投影为900913,arcgis server为10.0版本,地图服务的空间参考为3857. 与 ...
- HDU5804 Price List (BestCoder Round #86 A)水题
分析:大于总和输出1 #include <cstdio> #include <cstring> #include <algorithm> using namespa ...
- java读取目录下所有csv文件数据,存入三维数组并返回
package dwzx.com.get; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; ...
- Linux上修改weblogic的内存大小
我们经常在使用WebLoigc部署应用程序后,发现程序运行速度并不是很快,遇到这种情况我们可以尝试调整启动时分配的内存,设置方法有两种: 一.在../domain/setDomainEnv.sh文件中 ...
- 迅影QQ视频查看v2.0 源码
骗了1200多位朋友,实在惭愧,现在公开我自己的源码实现.本人新人,代码很烂,请凑合看吧O(∩_∩)O~ Form1.cs using System; using System.Text.Regula ...
- python 数字和字符串转换问题
一.python中字符串转换成数字 (1)import string tt='555' ts=string.atoi(tt) ts即为tt转换成的数字 转换为浮点数 string.atof(tt) ( ...
- 用js完成blog项目
//前台调用 var $ = function (args) { return new Base(args); } //基础库 function Base(args) { //创建一个数组,来保存获取 ...
- JavaScript高级程序设计(第三版)第二章 在HTML中使用JavaScript
2.1 <script>元素 <script>定义了下列6个属性: async:可选.表示应该立即下载脚本,但不应妨碍页面的其他操作,比如下载其他资源或等待加载其他脚本.只对外 ...
- 【脚本语言对比】BASH,PERL以及PYTHON
据说: BASH能调用linux的应用程序,这是其最大的优点,也是其最大的缺点. PERL那复杂的语法确实看得让人想吐. python很优美,但是据说对正则的支持不够,没有perl强大. 总结一下学习 ...
- Visual Studio Profiler 跟踪检查每个exe dll 性能 执行时间 CPU占用情况的方法