暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MapReduce-原理剖析之shuffle(上)

码农大腿哥 2021-03-10
599
前言:

map端过来的数据,经历shuffle之后,就能在reduce端整整齐齐的进行聚合计算了

那么,数据到底在shuffle过程中经历了什么?shuffle中蕴藏着哪些不为人知的玄机?

这一切的背后,是人性的扭曲还是道德的沦丧,是玄学的操纵还是科技的支配

请收看大腿大数据之《走进shuffle-上》

本篇目标:

深刻理解shuffle机制的处理过程



一般来说,我们把Map()方法后,reduce()方法前的数据处理过程称之为shuffle。shuffle对数据进行了整理分类,所以又称"洗牌"

shuffle过程比较复杂,为了便于理解,我把整个流程分成了5部分:


1)Collect阶段:收集map()方法发来的数据

2)Spill阶段:将数据溢写到磁盘

3)mapMerge阶段:对溢写到磁盘的数据进行合并

4)Copy阶段:拉取MaTask数据到ReduceTask

5)reduceMerge阶段:对数据进行合并

下面就来看看每一步中具体做了哪些事情


01


Collect阶段


map()方法将数据处理成了(key,value)形式,然后输入到环形缓冲区,在这个过程中经历了以下几步


1)分区

数据在进入环形缓冲区前,先执行了getPartition()方法,标记了数据每个数据属于哪个分区

2)写入环形缓冲区

环形缓冲区是一块内存,默认100MB。数据写入环形缓冲区时,一半写数据,一半用来写元数据(记录了数据的索引和分区等信息)

3)快速排序

当数据写到环形缓冲区80%大小时,再写内存就要满了。所以就开始反向写,同时将数据溢写到磁盘

不过在溢写之前,会采用快排对数据进行一次排序,确保数据是排好序的

本阶段过程如下图:


02

spill阶段


环形缓冲区的数据要溢写到磁盘上,它分多次溢写产生多个文件,不是一次性写完。写到磁盘中的数据是分区并排好序的,如下图


不过,上图是溢写文件的逻辑结构。在物理上,实际存储了两个文件:spill.index(元数据文件)和spill.out(数据文件)

03

mapMerge阶段

溢写的文件需要进行一次合并,采用归并排序将多个溢写文件的数据合成排序,合并成一个大文件


同样的,归并后的文件在物理上,也是存储了两个文件:file.out.index(元数据文件)和file.out(数据文件)

04

Copy阶段

当MapTask全部执行完成后,对应的ReduceTask会拷贝对分区的数据


数据是由ReduceTask主动拉取的,数据先存储在内存中,如果文件大小超过一定阀值,则溢写到磁盘上

05

reduceMerge阶段

ReduceTask将拉取过来的所有文件进行合并,采用归并排序进行排序,得到最终的同一分区的排好序的数据


合并成大文件后,Shuffle的过程也就结束了,后面进入ReduceTask的逻辑运算过程




shuffle流程至此算是讲完了,不过其中的细节仍需完善:分区是怎么分的?环形缓冲区又是什么? 

欲知详情,且听下篇分解

你学废了吗?

— END  —


文章转载自码农大腿哥,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论