MapReduce的shuffle分为map阶段的shuffle和reduce阶段的shuffle,下面就分别来做介绍。
之前我们学的是map阶段并不是直接把数据给reduce,而是会把数据分好,该分区的分区,该封装的封装,该合并的合并再给到reduce,下面就来详细介绍这个过程。
1.每一个MapTask都会自带一个缓冲区(默认大小100m)。
2.在缓冲区中会进行分区,排序,合并。
3.缓冲区的大小是固定的,当达到溢出边界(是缓冲区的80%)的时候,缓冲区就会产生溢写操作, 把数据写入磁盘的溢写文件,每次溢写都会产生一个溢写文件。
4.溢写文件都是局部有序整体无序的。
5.当mapTask处理完所有数据后会做一个merge操作会将所有的溢写文件合并,如果缓冲区里也有数据,则会把缓冲区里的数据一起merge到finalout文件中,无论如何,都会产生一个final out 。
6.merge操作:会对整体文件进行分区排序合并,使用的是归并排序。
这里我们将会知道reduce是如何抓取map中finalout的数据,并且如何输出数据到hdfs上。 1.当达到启动阈值(默认是0.05,即当有5%的MapTask结束)的时候,ReduceTask就会启动去MapTask抓取数据
2.ReduceTask启动fetch线程通过get请求(携带分区号)的方式来抓取数据,在抓取数据的时候只抓取当前要处理的分区的数据
3.ReduceTask会将抓取来的每一段数据临时存储到本地磁盘上,抓取完成之后,会将这些临时文件merge成一个大文件。在merge过程中,会对数据再次排序。这次排序依然使用的是归并排序
4.merge完成之后,将这个文件中相同的键对应的值分到一组去,形成一个伪迭代器,这个过程称之为分组(group)
5.形成迭代器之后,每一个键调用一次reduce方法