一、什么是shuffle

在map过程输出与reduce过程输入的中间,有一个过程叫做shuffle,是MapReduce计算框架处理数据合并与连接的操作。分布式计算需要将不同服务器上的相关数据(根据相同的key)汇集到同一个节点的同一个进程进行下一步计算,这就是shuffle。

二、shuffle过程

图1 MapReduce的shuffle过程示意图

map计算结果都会先写入map进程所在服务器节点本地文件中(非HDFS而是本地文件系统)。在map进程快完成的时候,MapReduce框架会启动shuffle过程,在map进程调用一个Partitioner接口。此接口的实现逻辑将会对map产生的每个<key, value>进行reduce分区选择,然后通过HTTP通信发送给对应的reduce进程,reduce进程根据此信息访问下一步计算所需的输入数据。

map输出的<key, value>会shuffle到哪个reduce进程是由Partitioner接口的实现来决定的。MapReduce默认用key的哈希值(key.hashCode())对计划拉起的reduce任务数量取模,这样相同的key一定会落在相同的reduce任务ID上。

三、shuffle的意义

  1. shuffle是将分布式的计算结果进行有意义的聚合的必要过程。

  2. 不管是MapReduce还是Spark,只要是大数据批处理计算,一定有shuffle。

  3. shuffle是整个MapReduce过程中最难、最消耗性能的地方。

  4. shuffle由大数据计算框架自动完成,开发者无需关注具体实现,但了解shuffle对掌握大数据计算过程是十分必要的。

(整理自《大数据技术架构:核心原理与技术实践》)