2020-7-24
shuffle流程
shuffle流程是指MapOut→ReduceIn中间的过程,从Map的输出开始到Reduce方法之前
总共执行了四次排序,其中两次为归并排序
hadoop权威指南7.3
MapTask
对于MapTask,它会将数据的处理结果暂时放到环形缓冲区100MB,当环形缓冲区的使用率达到一定阈值(80%)之后,会对环形缓冲区的数据进行一次快速排序(排序且按照分区设置进行划分),并将这些数据溢写到磁盘上,每次溢写都产生一个溢写文件,当数据处理完毕后(产生很多溢写文件),它会对磁盘上所有的文件进行一次归并排序,最终输入到一个指定的路径。
MapTask最终的归并排序:又称merge过程,将每个溢写产生的小文件进行归并,将相同分区的数据放在一起,并且每个分区内按照key的排序规则进行排序。最终一个MapTask输出一个按照分区排列,且每个区域内均有序的数据
快速排序:环形缓冲区的每80% 就会组成一组数据,并存到磁盘上,这个过程叫做溢写。溢写的结果会经历一次快速排序。快速排序会将数据进行分区,并且每个分区的数据按照key进行排序
环形缓冲区:一个有用特性是:当一个数据元素被用掉后,其余数据元素不需要移动其存储位置。相反,一个非环形缓冲区(例如一个普通的队列)在用掉一个数据元素后,其余数据元素需要向前搬移。换句话说,圆形缓冲区适合实现先进先出缓冲区,而非圆形缓冲区适合后进先出缓冲区。
MapTask的环形缓冲区:默认100MB
存了索引和数据 ,collector.collect方法写入环形缓冲区,当容量达到80%时进行溢写
combiner见图
用job.setCombinerClass();里面可以传单独的combiner类,也可也直接传reducer。
实际根据业务逻辑安排。
ReduceTask
对于ReduceTask,他从每个MapTask上远程拷贝相应的数据文件,放在内存缓冲区(JVM虚拟机的堆内存的70%)上面,如果文件大小超过一定阈值(JVM虚拟机堆内存的70%的66% 或者 达到1000条数据),则会溢写(同时排序)到磁盘上。当所有数据拷贝完毕后ReduceTask会统一对内存和磁盘上所有的数据进行一次归并排序,10组进行一个归并,满足最后合并系数为10!
远程拷贝(fetch过程):ReduceTask会默认会开启5个线程(可设置)执行拷贝过程,一个reduce处理一个分区,线程会将结果发送到对应的ReduceTask
注意:图中左下角的公式是计算用的,是我根据Hadoop权威指南这本书提供的数据自己总结的,实际程序计算肯定不是这个公式!!!