Ever tried , Ever failed !
No matter ,Try again ! Fail again , Fail better !

Mapreduce 中的shuffle机制

在Hadoop MapReduce中,框架会确保reduce收到的输入数据是根据key排序过的。数据从Mapper输出到Reducer接收,是一个很复杂的过程,框架处理了所有问题,并提供了很多配置项及扩展点

Hadoop的核心思想是MapReduce,而MapReduce的核心是shuffle机制

  • 官网给出的流程图:

Map端

当map函数通过context.write()开始输出数据时,不是单纯地将数据写入到磁盘。为了性能,map输出的数据会写入到缓冲区,并进行预排序的一些工作。

1. Input Split

将数据进行切片,每一个切片就是一个map,也就是说map task的并发数量就是由切片的数量决定的。

2. Buffer In Memory

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

缓冲区的大小默认为100M,但是可以通过mapreduce.task.io.sort.mb这个属性来配置

3 .Spill

​ map将输出不断写入到这个缓冲区中,当缓冲区使用量达到一定比例之后,一个后台线程(溢写线程)开始把缓冲区的数据写入磁盘,这个写入的过程叫spill。开始spill的Buffer比例默认为0.80,可以通过mapreduce.map.sort.spill.percent配置。在后台线程写入的同时,map继续将输出写入这个环形缓冲,如果缓冲池写满了,map会阻塞直到spill过程完成,而不会覆盖缓冲池中的已有的数据。在写磁盘前,线程首先根据数据最终要传送到的 Reducer(通过调用 Partitioner 的 getPartition() 方法就能知道该输出要送往哪个 Reducer) 把数据划分成相应的分区(partition)。在每个分区中,后台线程按键进行内排序,如果有 Combiner,还要对排序后的数据进行 Combiner。

4.Merge

​ 在整个map task中,一旦缓冲达到设定的阈值,就会触发spill操作,写入spill文件到磁盘,因此最后可能有多个spill文件。在map task结束之前,这些文件会根据情况合并到一个大的分区的、排序的文件中,排序是在内存排序的基础上进行全局排序。下图是合并过程的简单示意:

5. Map task总结

1、数据分片
2、运算结果写入缓存
3、缓存达到阈值,溢写到磁盘文件 ,溢写前会进行分区,分区内排序和合并(可选)
4、归并成大文件

  • 每个Map任务分配一个缓存
  • MapReduce默认100MB缓存
  • 设置溢写比例0.8
  • 分区默认采用哈希函数
  • 排序是默认的操作
  • 排序后可以合并(Combine)
  • 合并不能改变最终结果
  • 在Map任务全部结束之前进行归并
  • 归并得到一个大的文件,放在本地磁盘

Reduce端

当mapreduce任务提交后,reduce task就不断通过RPC从JobTracker那里获取map task是否完成的信息,如果获知某台TaskTracker上的map task执行完成,Shuffle的后半段过程就开始启动。其实呢,reduce task在执行之前的工作就是:不断地拉取当前job里每个map task的最终结果,并对不同地方拉取过来的数据不断地做merge,也最终形成一个文件作为reduce task的输入文件。

  • 领取数据
  • 归并数据
  • 数据输入给Reduce任务

Reduce任务通过RPC向JobTracker询问Map任务是否已经完成,若完成,则领取数据
Reduce领取数据先放入缓存,来自不同Map机器,先归并,再合并,写入磁盘 多个溢写文件归并成一个或多个大文件,文件中的键值对是排序的

当数据很少时,不需要溢写到磁盘,直接在缓存中归并,然后输出给Reduce

总结

1.Map 阶段的输出是写入本地磁盘而不是 HDFS,但是一开始数据并不是直接写入磁盘而是缓冲在内存中。

2.缓存的好处就是减少磁盘 I/O 的开销,提高合并和排序的速度。

3.内存缓冲区的大小默认是 100M(原则上说,缓冲区越大,磁盘 io 的次数越少,执行速度就越快。缓冲区的大小可以通过 mapreduce.task.io.sort.mb 参数调整),所以在编写 map 函数的时候要尽量减少内存的使用,为 Shuffle 过程预留更多的内存,因为该过程是最耗时的过程。

参考自:https://blog.csdn.net/zhengwei223/article/details/78304764?locationNum=3&fps=1

​ https://www.cnblogs.com/felixzh/p/4680808.html

​ https://blog.csdn.net/u012151684/article/details/72589302


赞(4) 打赏
未经允许不得转载:Mr. Almost的个人博客 » Mapreduce 中的shuffle机制

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

谢谢老板~

支付宝扫一扫打赏

微信扫一扫打赏