MapReduce之Shuffle过程详解


Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方。

map端shuffle:

map端

  1. map读取数据 ,读取数据之前是split(文件逻辑上的切分)

  2. Partition:map的结果由哪个reduce来接收,设置reduce的个数 
    默认操作是:对key hash后再以reduce task数量取模,返回值决定着该键值对应该由哪个reduce处理。为了平均reduce的处理能力,防止数据倾斜,保证负载均衡。

    写入缓冲区、溢写: 
    将key/value以及Partition结果都写入到缓冲区,缓冲区的作用:批量收集map结果,减少磁盘IO的影响。

    当缓冲区的数据达到阀值(默认0.8),溢写线程启动,锁定这80MB的内存,执行溢写过程。剩下的20MB继续写入map task的输出结果。互不干涉!

    帮助理解partition

  3. sort:当溢写线程启动后,需要对这80MB空间内的key做排序(Sort)。排序是mapreduce模型的默认行为,也是对序列化的字节做的排序。排序规则:字典排序!

    Combiner(合并每个 溢写文件中的key值相同的value); 
    溢写过程一个很重要的细节在于,如果有很多个key/value对需要发送到某个reduce端,那么需要将这些键值对拼接到一块,减少与partition相关的索引记录。如果client设置过Combiner,其会将有相同key的key/value对的value加起来,减少溢写到磁盘的数据量。注意:这里的合并并不能保证map结果中所有的相同的key值的键值对的value都合并了,它合并的范围只是这80MB,它能保证的是在每个单独的溢写文件中所有键值对的key值均不相同!

  4. merge(合并溢写文件): 
    溢写生成的临时文件的个数随着map输出结果的数据量变大而增多,当整个map task完成,内存中的数据也全部溢写到磁盘的一个溢写文件。也就是说,不论任何情况下,溢写过程生成的溢写文件至少有一个!但是最终的文件只能有一个,需要将这些溢写文件归并到一起,称为merge。

    merge是将所有的溢写文件归并到一个文件,结合上面所描述的combiner的作用范围,归并得到的文件内键值对有可能拥有相同的key,这个过程(merge)如果client设置过Combiner,也会合并相同的key值的键值对,如果没有,merge得到的就是键值集合,如{“aaa”, [5, 8, 2, …]}

注意:combiner的合理设置可以提高效率,但是如果使用不当会影响效率!

reduce端shuffle:

reduce端

  1. Copy过程:从map端拉取数据,先放在内存缓冲区中 
    (可能会有 不同的map输出的目标reduce是同一个,所以会从不同的map端拉取)
  2. 分组 ,是针对 map端的partition应该分到哪个reduce端 
    如果分到同一个reduce端的key有多个,把相同的key分开然后在sort
  3. Merge过程(也会有sort的过程):类似于map端的merge,将拉取到的文件来进行合并,合并成一个大文件(并且排序) 
    内存缓冲区文件到达阈值, 从内存中溢写到磁盘, 
    不再有map端文件拉取,磁盘中进行合并(合并为一个最终文件,供reduce使用)

  4. reduce的输入:最终文件(在本地磁盘),输入给reduce。

来看一张整体的图:

这里写图片描述


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值