Hadoop Shuffle学习

Shuffle

In many ways,the shuffle is the heart of MapReduce and is where the ‘magic’ happens

Shuffle横跨Map、Reduce两个阶段

在这里插入图片描述

  • Map阶段
  1. 进入Memory Buffer。每个Map都对应一个Memory Buffer ,每个map处理以后的结果都会进入环形缓存区。

  2. Partition。对每一个<k,v>进行分区(打标签)。具体实现是根据key或value及reduce的数量来决定当前的这对输出数据最终应该交由哪个reduce task处理。默认取key的hash值后再以reduce task数量取模。默认的取模方式只是为了平均reduce的处理能力,如果用户自己对Partitioner有需求,可以订制并设置到job上。

    有很多文章写得是spill以后,进行分区和排序。个人认为,数据在内存处理更快更方便,将处理以后的数据再存入硬盘,显然更合理。

  3. Spill。当环形缓存区容量达到80%时(避免数据处理速度大于读写速度,造成数据丢失),就会开启单独的溢写进程, 将数据临时写入磁盘

  4. Sort。溢写开始时,就会开始对数据根据key进行排序,且是对同一分区上的数据进行排序,即对序列化的字节排序。

  5. combiner(可选)。当很多<k,v>需要发送到同一reduce端时,则他们被拼接到一起。比如<"aaa”,1>、<“aaa”,1>这样的键值对,我们就应该把它们的值合在一起,成为<“aaa”,2>。这个combiner是可以用户设置的,可以做累加取最值等操作,它被用于减少溢写到磁盘的数据量,对map task的中间结果进行优化,并将结果作为reduce task的输出。

  6. merge。当map task结束时,内存缓冲区内的文件即使不到80%,也会成为一个溢写文件。这里会将溢写文件归并到一起(减少输出),这个过程即为merge.在wordcount中,map task1的<“aaa”,5>,map task2的<“aaa”,1>会被merge成一个group,{“aaa”,[5,1,2,3…]},group中的值就是从不同溢写文件中读取出来的,在这里又会做一个combine,比如wordcount,这里又会将“aaa”的value合并(仍然没有计数)。

    至此map端结束,reduce task不断地通过rpc从job tracker获取map task是否完成,如果获知某台tasktracker上的map task完成,shuffle的后半段即开始启动
  • Reduce端
  1. Copy。本质就是拉数据,通过http请求map输出文件中,属于当前reduce分区的数据。

  2. Merge。把不同map端copy获取的值进行归并,copy来的值先放内存中,与map端不同,这里的内存缓 存区更加灵活,(与jvm heap size有关,不做深究),但也是数据量达到一定阈值,就启动内存到磁盘merge。同样,如果设置了combiner,也是会启动。

    最终的数据默认以文件存在硬盘中,可以通过优化,存在内存中。

感谢下面两篇文章作者深入浅出的讲解

简单搞定Shuffle机制运行原理

MapReduce:详解Shuffle过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

simpsun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值