2023年11月26日发(作者:)

MapReduceshuffle过程详解(分⽚、分区、合并、归并)

shuffle过程

shuffle概念

shuffle的本意是洗牌、混洗的意思,把⼀组有规则的数据尽量打乱成⽆规则的数据。⽽在MapReduce中,shuffle更像是洗牌的逆过程,

指的是将map端的⽆规则输出按指定的规则“打乱”成具有⼀定规则的数据,以便reduce端接收处理。其在MapReduce中所处的⼯作阶

段是map输出后到reduce接收前,具体可以分为map端和reduce端前后两个部分。在shuffle之前,也就是在map阶段,MapReduce会

对要处理的数据进⾏分⽚(split)操作,为每⼀个分⽚分配⼀个MapTask任务。接下来map()函数会对每⼀个分⽚中的每⼀⾏数据进⾏处

理得到键值对(key,value),其中key为偏移量,value为⼀⾏的内容。此时得到的键值对⼜叫做“中间结果”。此后便进⼊shuffle阶段,

因为频繁的磁盘I/O操作会严重的降低效率,因此“中间结果”不会⽴马写⼊磁盘,⽽是优先存储到map节点的“环形内存缓冲区”,在写

⼊的过程中进⾏分区(partition),也就是对于每个键值对来说,都增加了⼀个partition属性值,然后连同键值对⼀起序列化成字节数组写

shuffle详细流程

Mapshuffle

①分区partition

在将map()函数处理后得到的(key,value)对写⼊到缓冲区之前,需要先进⾏分区操作,这样就能把map任务处理的结果发送给指定的

reducer去执⾏,从⽽达到负载均衡,避免数据倾斜。MapReduce提供默认的分区类(HashPartitioner),其核⼼代码如下:

1. public class HashPartitioner extends Partitioner {

2.

3. /** Use {@link Object#hashCode()} to partition. */

4. public int getPartition(K key, V value,

5. int numReduceTasks) {

6. return (de() & _VALUE) % numReduceTasks;

7. }

8.

②最终也会以临时⽂件的形式存储到本地磁盘

⾄于真实情况是怎么样的,我还不清楚。。。

④归并merge

【reducer如何知道要从哪台机器上去的map输出呢?】