MapReduce中的shuffle

https://blog.csdn.net/u014374284/article/details/49205885

https://blog.csdn.net/asn_forever/article/details/81233547

https://blog.csdn.net/u014374284/article/details/49205885

 

个人觉得整个过程很复杂,不管是面试还是笔试说出大概流程就可以了。

在Map端的shuffle过程是对Map的结果进行分区、排序、分割,然后将属于同一划分(分区)的输出合并在一起并写在磁盘上,最终得到一个分区有序的文件,分区有序的含义是map输出的键值对按分区进行排列,具有相同partition值的键值对存储在一起,每个分区里面的键值对又按key值进行升序排列(默认)。

另外一种说法map段的shuffle:

1、中间结果”不会立马写入磁盘,而是优先存储到map节点的“环形内存缓冲区”,在写入的过程中进行分区(partition)

ps:中间结果为:map阶段,MapReduce会对要处理的数据进行分片(split)操作,

map()函数会对每一个分片中的每一行数据进行处理得到键值对(key,value),其中key为偏移量,value为一行的内容。

此时得到的键值对又叫做“中间结果”。

2、当写入的数据量达到预先设置的阙值后(mapreduce.map.io.sort.spill.percent,默认0.80,或者80%)便会启动溢写出线程将缓冲区中的那部分数据溢出写(spill)到磁盘的临时文件中,并在写入前根据key进行排序(sort)和合并(combine,可选操作)

3、当整个map任务完成溢出写后,会对磁盘中这个map任务产生的所有临时文件(spill文件)进行归并(merge)操作生成最终的正式输出文件此时的归并是将所有spill文件中的相同partition合并到一起,并对各个partition中的数据再进行一次排序(sort),生成key和对应的value-list,文件归并时,如果溢写文件数量超过参数min.num.spills.for.combine的值(默认为3)时,可以再次进行合并。

在Reduce端,shuffle主要分为复制Map输出、排序合并两个阶段。

posted @ 2020-04-23 17:10  再见傅里叶  阅读(839)  评论(0编辑  收藏  举报