认识Shuffle
map task:map端可以执行的一个进程
reduce task:reduce端可以执行的一个进程
shuffle是介于maptask和reducetask之间的一个过程
shuffle可以分为map端的shuffle和reduce端的shuffle
mapreduce中,map阶段处理的数据如何传递给reduce阶段,是mapreduce框架中最关键的一个流程,这个流程就叫shuffle
具体来说:就是将map task输出的处理结果数据,分发给reduce task,并在分发的过程中,对数据按key进行了分区和排序。
Shuffle执行过程
shuffle是MR处理流程中的一个过程,它的每一个处理步骤是分散在各个map task和reduce task节点上完成的。
Map端shuffle
- 每个map读取原数据的一部分(inputSplit),执行Mapper操作。
- 从Mapper端输出的键值对数据进入到环形缓冲区(100M)
- 环形缓冲区容量达到80%产生溢写,写入到磁盘缓冲区。
- 在磁盘缓冲区中分区(partitioner), 排序(sort),合并(combiner)
Reduce端shuffle
- 由reducetask向maptask拉取数据,进行分组排序(归并算法)
- 把数据组合成(key,序列)发送到Reducer类中执行
- 在Reducer类中处理数据,把结果写到文件中
Partitioner分区机制
根据不同的业务逻辑需求进行不同的数据分区。
分区的数量与reduce数量的关系:分区数量 <= reduce的数量
-
分区数量 = reduce数量
每个reduce找自己相应分区就ok,最理想的状态
-
分区数量 < reduce数量
每个reduce找自己相应分区就ok,但是会有剩余reduce,浪费资源
-
分区数量 > reduce数量(不等于1)
reduce的数量不够分配每个分区的内容,执行代码时报错
-
分区数量为n个,reduce数量为