Shuffle是mapReduce的核心,要想理解MapReduce, Shuffle是必须要了解的。
文字叙述:
1.mapTask的数量来源于切片的数量,mapTask读取数据时默认用的是TextInputFormat中的RecordReader的read方法读取一行数据,返回给们自定义的mapper,如果没有自定义mapper,框架中有默认的mapper,会把读取的数据原样输出。
2.读取后context.write方法写出,通过outputCollector组件输出到环形缓冲区里(数组),默认是100M的大小。外面有指针指向待溢出的当前的数值
3.环形缓冲区中的数据到达总大小的80%时会进行溢出操作,剩下的20%空间做排序用,默认是快速排序。通过splier溢出到本地
在溢出之前先对环形缓冲区中要溢出的数据进行分区(hashpartitioner,通过key的hashcode%reduceNum)和排序(sort)
4.每次溢出后都会产生一定的文件,全部溢出后会将本地的文件进行一次合并,其余的mapTask也同时进行合并操作
5.此时MrAppMaster会通知reduceTask来读取数据,每次读取自己指定区的一组数据,是根据groupingComparator(key,nextKey)组件来进行确认,返回给自定义的reducer
6.reducer中的context.write方法调用outputFormat组件(默认是TextOutputFormat)中的recordWrite的write写出到hdfs上,最终形成part-r-00000这样的输出文件