1.Shuffle概述
1.1 shuffle本意
《柯林斯英汉双解大词典》的shuffle愿意为“洗牌”。
shuffle:rearrange (a deck of cards) by sliding the cards over each other quickly.
shuffle:洗牌
同义词:mix(混合);mixup(混淆;拌和;调和)
——《柯林斯英汉双解大词典》
1.2 MapReduce中的shuffle
shuffle的本意是洗牌、混洗的意思,指把一组有规则的数据尽量打乱成无规则的数据。而在MapReduce中,shuffle更应该被理解成“规整”(跟愿意正好相反),即把一组无规则的数据整理成有规则的数据。对应到MapReduce的处理中,shuffle是将map端的无规则输出按指定的规则“整理”成具有一定规则的数据,以便reduce端接收处理。
官方的Shuffle过程如图1所示,不过细节有错乱,官方图并没有说明partition、sort、fetch、merge等具体作用于哪个阶段。从图中可以看出,Shuffle处于map输出后和reduce接收前。
map(映射)阶段将原始数据转化为键值对,MapReduce会对要处理的数据进行分片(split)操作,为每一个分片分配一个MapTask任务,在Mapper中map()函数会对每一个分片中的每一行数据进行处理得到键值对(key,value),此时得到的键值对又叫做“中间结果”。此后便进入shuffle阶段,shuffle对map阶段输出的“中间结果”键值对进行拷贝、归并、排序等操作,整合后发送至Reducer端等待处理。shuffle结束后才进入reduce(规约)阶段,将具有相同key值的value进行合并处理后再转换成新的键值对作为最终输出结果。
1.3为什么一定要shuffle?
原因1:MapReduce的设计原则
MapReduce makes the guarantee that the input to every reducer is sorted by key.
在MR的设计原则之一就是“每个Reducer的输入都是按Key(键值对中的键)排序的”。
原因2:数据分发
Hadoop的集群环境,大部分的map task和reduce task是执行在不同的节点上的,reduce计算时需要先获取到map的输出结果,因此要有模块专门负责从reduce端拉取数据到reduce端。为了尽可能提升执行效率,Shuffle在设计上要做到:
(1)完整地从map task端拉取数据到reduce task端;
(2)在拉取数据的过程中,尽可能地减少网络资源的消耗;
(3)尽可能地减少磁盘IO对task执行效率的影响。
1.4Shuffle的意义
1.shuffle是隐藏的过程,是MR框架自动完成的,屏蔽了复杂的操作,让我们专注于业务逻辑的编写。了解shuffle的过程可以帮助我们更高效地实现Mapper和Reducer。
In many ways, the shuffle is the heart of MapReduce and is where the magic happens.
http://timepasstechies.com/mapreduce-shuffle-sort-phase/
2.正如这篇文