MapReduce 之 Shuffle过程

   我所认为的MapReduce 是一个分而之治的过程,首先Map阶段将数据分成一个个键值对(key,value)的形式,之后reduce阶段将含有相同key值的键值对做一个聚合,最终形成一个新的键值对。

而在Map和Reduce之间中最重要的就是Shuffle过程,shuffle是Hadoop默认给我们配置好的,而为了使reduce能更好的处理Map的结果,需要进行排序,分割等工作,这就是shuffle的过程。

其中shuffle 包括Map shuffle 与Reduce shuffle。

 

Map shuffle:

Map端的shuffle过程就是对Map的结果进行分区,排序,分割,之后划分到同一区域的输出会合并(merge)在一起,并且按照分区有序的写入到磁盘中,分区有序的含义是map输出的键值对按分区进行排列,具有相同partition值的键值对存储在一起,每个分区里面的键值对又按key值进行一定顺序的排列(这里貌似默认是升序?)

环形Buffer数据结构:每一个map任务有一个环形Buffer,map将输出写入到这个Buffer。环形Buffer是内存中的一种首尾相连的数据结构,专门用来存储Key-Value格式的数据(可以认为是一个字节数组)

Reduce shuffle:

reduce端的shuffle主要包括三个阶段,分别是copy,merge,reduce

Copy阶段:Reduce进程会通过Http的方式向NodeManger 发出请求已获取输出文件,NodeManger上会为分区文件运行reduce任务,reduce任务需要集群上不止一个map任务的输出,而每个map任务由于完成时间可能不同,因此需要复制机制。在Map任务执行的时候,会有partition的过程,而每个partition对应一个reducer,所以reduce会拷贝与之相对应的partition中的数据。

map任务在完成后会利用心跳机制通知application Master, application Master知道map与主机之间的一个映射关系,而reduce会周期性的向master询问,

Merge阶段:将Map端复制过来的数据先放入内存缓冲区中 
Merge有3种形式,分别是内存到内存,内存到磁盘,磁盘到磁盘。默认情况下第一种形式不启用,第二种Merge方式一直在运行(spill阶段)直到结束,然后启用第三种磁盘到磁盘的Merge方式生成最终的文件。如果map输出相当小,则会被复制到reduce任务的JVM内存,否则map输出被复制到磁盘。

Copy过来的数据会先放入内存缓冲区中,如果内存缓冲区中能放得下这次数据的话就直接把数据写到内存中,即内存到内存merge。Reduce要向每个Map去拖取数据,在内存中每个Map对应一块数据,当内存缓存区中存储的Map数据占用空间达到一定程度的时候,开始启动内存中merge,把内存中的数据merge输出到磁盘上一个文件中,即内存到磁盘merge。当属于该reducer的map输出全部拷贝完成,则会在reducer上生成多个文件(如果拖取的所有map数据总量都没有内存缓冲区,则数据就只存在于内存中),这时开始执行合并操作,即磁盘到磁盘merge,Map的输出数据已经是有序的,Merge进行一次合并排序,所谓Reduce端的sort过程就是这个合并的过程。一般Reduce是一边copy一边sort,即copy和sort两个阶段是重叠而不是完全分开的。

reduce阶段:在reduce阶段,对已排序输出中的每个键都要调用reduce函数。此阶段的输出直接写到输出文件系统,一般为HDFS。

 

转载于:https://www.cnblogs.com/boboli/p/9997402.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值