Hadoop Mapreduce的shuffle过程详解

1、map task读取数据时默认调用TextInputFormat的成员RecoreReader,RecoreReader调用自己的read()方法,进行逐行读取,返回一个key、value;

2、返回的key、value交给自定义的map方法,输出的context.write(key,value),再交给内部的OutputCollecter会不断写入一个环形缓冲区

  (就是一个数组,内存空间默认100M);

3、随着不断的写入,一般只占默认内存的80%,剩下的空间需要在溢出之前进行分区以及根据key进行快速排序,spiller就是负责将分过区并排好序的数据

  写入本地文件,溢出一次就会产生一个文件,这些文件存放于map task的工作目录,在溢出前可以使用combiner对数据进行合并,combiner会提高整体的

  运算速度,但是有可能会对最终结果造成影响,所以使用时需考虑清楚;

4、map task在本地产生的多个文件需要进行归并排序成一个大文件,也就是map task的最终文件,这个合并的过程称为merge,这个合并过程也可以使用combiner;

5、reduce task会将各个map task产生的相应分区的数据下载到本地磁盘工作目录,合并文件并对这些数据进行归并排序;

6、通过调用GroupingComparaor(key,nextk)识别出key相同的一组数据;

7、然后一组相同的key调用一次reduce方法,context.write(k,v)通过OutputFormat写入最终的文件。

以上从第三步到第六步就是shuffle的过程。

猜你喜欢

转载自www.cnblogs.com/chaofan-/p/9812216.html