softBufferLimit= (int)(kvbuffer.length * spillper); //记录缓存阈值
softRecordLimit = (int)(kvoffsets.length * spillper); //记录值缓存阈值
MapOutputBuffer对缓存的溢出处理也很简单,首先它要对这一部分缓存的map输出进行排序,在这里先排序的好处一是为了紧接着的key-value合并处理,二是为了key-value的分类(key-value类别就是它分配给了哪个reduce来处理)。最后这些key-value缓存被保存到两个临时中间文件:spill*.out、spill*.out.index,其中,spill*.out保存的是key-value的值,spill*.out.index保存了每一个reduce的输出key-value在spill*.out中的起始位置、原始长度、压缩长度等索引信息。每一次的缓存溢出处理产生的结果都可以看作是最后总结过的一个段,最后在所有的map操作输出数据处理完毕之后就要开始可并所有的中间段,产生总的一个.out和对应的.out.index文件。简单的看一下这个过程的序列图:
MapTask的RecordWriter实现之NewOutputCollector(2)
内容版权声明:除非注明,否则皆为本站原创文章。