MapReduce 的shuffle过程

Map过程处理完生成一堆键值对,并写入缓存,
最终缓存数据会写入磁盘,但是写入磁盘之前会经历一些操作才会写入磁盘。
经历分区,排序,可能会合并,这个过程结束,且缓存满了(并不是满了才写,而是到一定比例,默认是0.8,因为需要留缓存让map任务得以继续),再写入磁盘(非hdfs)
然后清空缓存,上述步骤会发生多次,每个磁盘文件,最后统一归并,最后归并成一个大的文件。这个大文件是分区的,对应的reduce任务处理对应的分区文件。

shuffle过程其实是下面四个步骤的第3步:
1、输入数据执行map任务
2、写入缓存
3、溢写(分区,排序,合并) 这一步是shuffle过程。
对于写入缓存的一堆键值对,先进行分区,这个分区就是为之后reduce从分区中取文件之间联系,这个分区一般对key进行hash函数,这样保证相同的key的值分在一个区。
对于每一个分区的数据,进行排序(系统默认根据字典序排序,无需用户干预)。
拍完序再进行合并,合并为了减少溢写到磁盘上的数据量,假如有两个键值对<a,1> ,<a,1>
合并的操作就是将其变为<a,2>的操作。两个键值对合并为一个键值对,这种才叫合并。
这种方式就可以减少很多的键值对,写入磁盘数据量大大减少。合并操作不是必须的,用户定义了,才执行合并操作。
然后就写入磁盘文件了。
重复1,2,3步骤,就会产生多个溢写文件了。
4、文件归并
最终在整个map任务执行完之前,系统会对这么多小的文件进行归并操作,合并为一个大的文件。这个大的文件里面的键值对,同样是分区的,且是排序的。

当jobtracker检测到上述步骤完全结束,会通知reduce去把属于该reduce的文件拉走。
上述就是map端的shuffle过程。

reduce从多个map任务中拉去文件,这些文件到reduce服务器上会先归并再合并。
再重说刚刚 如果map没有进行合并操作的话,那生成的就是<a,{1,1}>,经过了合并操作才是生成<a,2>
所以再总结一下:
在map过程的时候,如果:
执行了合并操作 生成<key,value>形式
没有执行合并操作 生成<key,value-list>形式

reduce的归并是指将<a,1> <a,1> 生成一个<a,{1,1}>的形式
为什么reduce还要生成<key,value-list>呢?因为reduce处理的文件是来自于多个map服务器上的,例如:
A map服务器文件:<a,4>
B map服务器问件:<a,5>
那reduce拿到这些文件要先,归并生成:<a,{4,5}>
然后再合并生成<a,9>

讲课的人说:
如果map输出的结果没有经过合并的话,输出的是:<key,value-list>
那按照这个理解,其实在溢写前,至少执行了 分区,排序,归并,可能发生合并。
因为map如果不执行合并,也有value-list的生成的话,说明肯定发生了归并操作了。
那我觉得讲课的人说的合并操作大大减少了磁盘写入量,其实是减少了,但没有大大减少吧。
最后,reduce端shuffle过程是在reduce函数执行之前。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值