MapReduce的Shuffle过程

一、Map端

Shuffle流程

  1. 每个输入分片(默认64MB或者128MB)会让一个map任务来处理,map输出的结果会存放在一个环形缓冲区(默认100MB,由io.sort.mb控制)内,当缓冲区快要溢出(超过缓冲区大小80%,由io.sort.spill.percent属性控制)的时候,会在本地文件系统创建一个溢出文件,将缓冲区的数据写入这个文件
  2. 在写入磁盘(溢写)之前,线程会根据reduce的任务数将数据划分为相同数目的分区,也就是一个reduce任务对应一个分区的数据。这样是为了避免有的reduce分配到大量数据,而有的reduce任务却分到很少的数据,甚至没有分到数据。分区就是对数据进行hash的过程,然后对每个分区中的数据进行排序,这个排序是按照对key的索引进行字典顺序排序,排序的手段是快排。如果此时设置了Combiner,将排序后的结果进行Combine操作,这样的目的是让尽可能少的数据写到磁盘。
  3. 当map任务输出最后一个记录时,会有很多溢出文件,这时需要将这些文件合并,合并的过程会有不断的sort(指归并排序)和设置的combine操作,目的如下:
  • 减少每次写入磁盘的数据量
  • 尽量减少下一复制阶段网络传输的数据量,最后合并成一个已经分区且排序的文件。为了减少网络传输的数据量,还可以将数据压缩,将mapred.compress.map.out设置true
  1. 将分区中的数据拷贝给对应的reduce任务。

二、Reduce端

  1. Reduce会接收到不同map任务传来的数据,并且每个map传来的数据都是有序的。如果reduce端接受的数据量相当小,则直接存储在内存中,如果数据量超过了缓冲区大小的一定比例,则对数据合并后溢写到磁盘中。
  2. 随着溢写文件增多,后台线程会将他们合并成为一个更大的有序的文件。
  3. 合并过程中会产生许多中间文件(写入磁盘),但MapReduce会让写入磁盘的数据尽可能少,并且最后一次合并没有写入磁盘,而是直接输入至reduce函数
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值