MapReduce--Shuffle原理
一、MR的shuffle流程。
1、什么是shuffle:mapreduce 主要分为map阶段和reduce阶段,map阶段主要是将从源加载过来的数据,转换为key value键值对。reduce阶段就是并行处理具有相同key的键值对,将其进行聚合处理,输出新的键值对作为结果。而为了保证reduce可以并行的处理map的结果,必须对map的输出结果进行一定的排序和分区,然后再传输至reduce上,这个过程就是shuffle。
2、shuffle过程:shuffle过程主要包括两个阶段,map shuffle和reduce shuffle。
(1)map shuffle:主要包括:分区、排序、分割、合并这些流程。首先,每个节点的map任务内部维护一个环形内存缓冲区,用来存储map任务的输出,默认100M。map任务产生的数据会先写进缓冲区当中,当数据达到缓冲区的阈值时,会将缓冲区中的数据溢出至本地磁盘,作为spill溢出文件。而在缓冲区溢出数据之前,会根据reduce的任务数量将缓冲区数据进行分区,并且在每个分区中是按照key进行排序的(快排)。
默认是使用HashPartitioner来分区,也可以自定义分区器进行分区。
若有combiner函数,这个函数则会在每个map分区排序后的输出结果上运行,用于将每次溢写出来的文件进行分区合并和归并排序。从而使map输出结果更加紧凑。combinner函数是对不同批次溢写出来的结果进行分区合并和分区内归并排序。(上方图)
https://blog.csdn.net/qq_35688140/article/details/84111972
---------map方法之后,数据进入分区方法,将数据标记好分区。数据先写进缓冲区,达到阈值后,进行溢写,溢写前在缓冲区中先按照key进行分区,并且每个分区内会按照key进行快排。溢写后产生大量溢写文件,若有combiner函数,则会对不同批次的溢写文件进行归并排序。最后将文件按照分区存储到磁盘。等待reduce端拉取。
注:
(2)reduce shuffle:主要包括:复制和合并两个阶段。reduce开启复制线程从map中复制数据,其中reduce可能会从多个map中复制数据,复制自己处理的分区数据,因此一旦有一个map任务完成,就开始进行复制。数据小就保存在内存,数据量大就溢出到磁盘,最后进行归并排序合并这些文件。
---------每个reduce去map中拉取对应分区的数据,每个map任务都会有数据,数据先存进缓存,缓存达到阈值了再存到磁盘,拉取完所有数据后,采用归并排序将内存和磁盘中的数据都进行排序。在进入 Reduce 方法前,可以对数据进行分组操作。
二、MapReduce过程中可能发生多少次排序:
总共可能发生 4 次排序过程:
1)Map 阶段:
环形缓冲区:对 key按照字典排序。排序手段:快速排序(能够手写快排)
溢写到磁盘中:对多个溢写的文件进行排序。排序手段:分区归并排序(能够手写归并)
2)Reduce 阶段:
按指定分区读取到 reduce缓存中(不够落盘):归并排序
Reduce task前分组排序:自定义