mapreduce的执行过程

2017-08-17  本文已影响0人  pamperxg

wordcount

InputFormat

map()方法中是我们自定义的业务逻辑,执行完逻辑后context.write(k,v)。把map过后的结果交给Outputcollector。OutputCollector把数据写入环形缓冲区(就是一个环形数组)。环形缓冲区中有一个保留区来进行分区排序。
分区排序实现:
默认分区是:HashPartitioner(hashcode模除以2(这个数字可以用来调整分区数))。排序:quicksort和外部排序混合使用。Key.compareTo。
缓冲区中的数据积累到一定阈值(如80%)通过spiller溢出(maptask完毕后还会有一次清空溢出)。溢出一次写一个文件,这些文件分区且有序。最后再merge这些文件(mergesort)形成一个maptask的最终文件。在这个文件中有几个分区就会有几个reducer,且这个分区与环形缓冲区中分区相对应。

shuffle

maptask结束后,开始reducetask。reducer到执行maptask的机器下载属于自己分区的数据到其本地磁盘工作目录,有几个maptask对应下载到几个文件。然后将这几个文件merge(mergesort)。reducer里自定义的reduce方法,对每一组key(相同key即为一组,通过GroupingComparator(k,nextk)组件判断key是否相同)。reduce(k,v)中一组中第一个传入的key作为k,value是一个可以迭代这一组value的迭代器。执行完自定义reduce()的逻辑后context.write(k,v)。然后调用OutputFormat(默认TextOutputFormat)中的RecordWriter中的write(k,v)方法把结果写入FileoutputFormat.setoutputpath(file://'xx')中。不同的reducer写出不同的文件,part-r00000,part-r00001……。

上一篇 下一篇

猜你喜欢

热点阅读