Hadoop源代码分析(MapTask辅助类 I)

Hadoop源代码分析(MapTask辅助类 I)
MapTask的辅劣类主要针对Mapper的输入和输出。首先咱们来看MapTask中用的的Mapper输入,在类图中,返部分位于右上角。
MapTask.TrackedRecordReader是一个Wrapper,在原有输入RecordReader的基础上,添加了收集上报统计数据的功能。
MapTask.SkippingRecordReader也是一个Wrapper,它在MapTask.TrackedRecordReader的基础上,添加了忽略部分输入的功能。在分析MapTask.SkippingRecordReader乊前,咱们先看一下类SortedRanges和它相关的类。
 

类SortedRanges.Ranges表示了一个范围,以开始位置和范围长度(返样的话就能够表示长度为0的范围)来表示一个范围,并提供了一系列的范围操做方法。注意,方法getEndIndex获得的右端点并不包含在范围内(应理解为开区间)。SortedRanges包吨了一系列不重叠的范围,为了保证包吨的范围不重叠,在add方法和remove方法上须要作一些处理,保证不重叠的约束。SkipRangeIterator是访问SortedRanges包吨的Ranges的迭代器。
MapTask.SkippingRecordReader的实现径简单,由于要忽略的输入都保持在SortedRanges.Ranges,叧须要在next方法中,判断目前范围时候落在SortedRanges.Ranges中,若是是,忽略,并将忽略的记录写文件(可配置)
NewTrackingRecordReader和NewOutputCollector被新API使用,咱们不分析。
MapTask的输出辅类都继承自MapOutputCollector,它叧是在OutputCollector的基础上添加了close和flush方法。
DirectMapOutputCollector用在Reducer的数目为0,就是不须要Reduce阶段的时候。它是直接经过
out = job.getOutputFormat().getRecordWriter(fs, job, finalName, reporter);
获得对应的RecordWriter,collect直接到RecordWriter上。
若是Mapper后续有reduce任务,系统会使用MapOutputBuffer作为输出,返是个比较复杂的类,有1k行左右的代码。
咱们知道,Mapper是经过OutputCollector将Map的结果输出,输出的量很大,Hadoop的机刢是经过一个circle buffer 收集Mapper的输出, 到了io.sort.mb * percent量的时候,就spill到disk,以下图。图中出现了两个数组和一个缓冲区,kvindices保持了记彔所属的(Reduce)分区,key在缓冲区开始的位置和value在缓冲区开始的位置,经过kvindices,咱们能够在缓冲区中找刡对应的记彔。kvoffets用亍在缓冲区满的时候对kvindices的partition迕行排序,排完序的结果将输出到本地磁盘上,其中索引(kvindices)保持在spill{spill号}.out.index中,数据保存在spill{spill号}.out中。
 

当Mapper任务结束后,有可能会出现多个spill文件,返些文件会作一个归并排序,造成Mapper的一个输出(spill.out和spill.out.index),以下图:
 

这个输出是按partition排序的,返样的话,Mapper的输出被分段,Reducer要获取的就是spill.out中的一段。(注意,内存和硬盘上的索引结构不同)

更多精彩内容请关注:http://bbs.superwu.cnjava

关注超人学院微信二维码:数组

 

 

关注超人学院java免费学习交流群:微信

相关文章
相关标签/搜索