MapReduce之Shuffle 三个阶段详解
1、 shuffle的基本概念
MapReduce确保每个reducer的输入都按key进行排序,系统执行排序的过程——将map输出作为输入传给reducer——称之为shuffle。可以将其理解为从map产生输出到reduce的消化输入的整个过程。
2、Shuffle 三个阶段分别
shuffle就是combine,partition,combine的组合
第一个是 map端的combine,是在map本地把同key的放在一起成列表 (Combiner 阶段)
第二个是 partition分割,把键值对按照key对应分配到reduce (Copy phase )
第三个是 reduce端的combine,把同key的再合并得到最后的reduce输入( Sort phase 应该为合并阶段 merge,因为排序是在map进行的)
shuffle阶段运行图:
说明:
1)Combiner 可做看local reducer
合并相同的key 对应的value (wordcount 例子)
通常与Reducer 逻辑一样
好处
减少Map Task 输出数据量(磁盘IO )
减少Reduce-Map 网络传输数据量( 网络IO)
如何正确使用
结果可叠加
Sum(YES!) ,Average (NO!)
2) Partitioner 决定了Map Task 输出的每条数据
交给哪个Reduce Task 处理
默认实现:hash(key) mod R (对应hashCode取模)
R 是Reduce Task 数目
允许用户自定义
很多情况需自定义Partitioner继承HashPartitioner类即可
3、 关于Combiner 与 Partitioner的实例:
首先准备测试数据: