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的过程。