MapReduce中的shuffle详解(转)
发布网友
发布时间:2024-10-23 20:54
我来回答
共1个回答
热心网友
时间:2024-11-04 13:14
1、在MapReduce中,mapper阶段处理的数据如何传递给reducer阶段,这是MapReduce框架中最关键的一个流程,即Shuffle。
2、Shuffle指的是数据混洗,其核心机制包括数据分区、排序、局部聚合、缓存、拉取和再合并排序。
3、具体来说,Shuffle就是将MapTask输出的处理结果数据,按照Partitioner组件制定的规则分发给ReduceTask,并在分发过程中,对数据按key进行分区和排序。
MapReduce的Shuffle过程介绍
Shuffle的本义是洗牌、混洗,把一组有一定规则的数据尽量转换成一组无规则的数据,越随机越好。MapReduce中的Shuffle更像是洗牌的逆过程,把一组无规则的数据尽量转换成一组具有一定规则的数据。
为什么MapReduce计算模型需要Shuffle过程?我们都知道MapReduce计算模型一般包括两个重要的阶段:Map是映射,负责数据的过滤分发;Reduce是规约,负责数据的计算归并。Reduce的数据来源于Map,Map的输出即是Reduce的输入,Reduce需要通过Shuffle来获取数据。
从Map输出到Reduce输入的整个过程可以广义地称为Shuffle。Shuffle横跨Map端和Reduce端,在Map端包括Spill过程,在Reduce端包括copy和sort过程。
Spill过程包括输出、排序、溢写、合并等步骤。
Collect
每个Map任务不断地以对的形式把数据输出到在内存中构造的一个环形数据结构中。这个数据结构其实就是个字节数组,叫Kvbuffer,里面不光放置了数据,还放置了一些索引数据,给放置索引数据的区域起了一个Kvmeta的别名。
索引是对在kvbuffer中的索引,是个四元组,包括:value的起始位置、key的起始位置、partition值、value的长度。
当Kvbuffer用得死死得,一点缝都不剩的时候再开始Spill,那Map任务就需要等Spill完成腾出空间之后才能继续写数据。
Spill这个重要的过程是由Spill线程承担,Spill线程从Map任务接到“命令”之后就开始正式干活,干的活叫SortAndSpill。
Sort
先把Kvbuffer中的数据按照partition值和key两个关键字升序排序,移动的只是索引数据,排序结果是Kvmeta中数据按照partition为单位聚集在一起,同一partition内的按照key有序。
Spill
Spill线程为这次Spill过程创建一个磁盘文件:从所有的本地目录中轮训查找能存储这么大空间的目录,找到之后在其中创建一个类似于“spill12.out”的文件。
所有的partition对应的数据都放在这个文件里,虽然是顺序存放的,但是怎么直接知道某个partition在这个文件中存放的起始位置呢?强大的索引又出场了。
每一次Spill过程就会最少生成一个out文件,有时还会生成index文件。
Map端的Shuffle过程到此结束。
Copy
Reduce任务通过HTTP向各个Map任务拖取它所需要的数据。每个节点都会启动一个常驻的HTTP server,其中一项服务就是响应Reduce拖取Map数据。
Reduce任务拖取某个Map对应的数据,如果在内存中能放得下这次数据的话就直接把数据写到内存中。
Reduce要向每个Map去拖取数据,在内存中每个Map对应一块数据,当内存中存储的Map数据占用空间达到一定程度的时候,开始启动内存中merge,把内存中的数据merge输出到磁盘上一个文件中。
如果在内存中不能放得下这个Map的数据的话,直接把Map数据写到磁盘上,在本地目录创建一个文件,从HTTP流中读取数据然后写到磁盘,使用的缓存区大小是K。
Reduce端的Shuffle过程至此结束。