mapreduce处理流程以及shuffle机制

mapreduce处理流程

1. 读取指定目录下待处理文件,假设数据大小为200M;

2. 在客户端submit()之前,获取待处理数据的信息,然后根据设置的**配置参数**,形成一个任务规划,就是**切片信息**,根据待处理数据文件大小根据参数配置划分为不同的文件,默认是128M进行切分,待处理数据文件就会被切分成两个文件;

3. 切片完成之后,就会向Yarn提交切片信息(Job.split .jar job.xml);

4. Yarn收到消息之后会调用ResourceManager创建一个ApplicationMaster(AppMaster)它是负责资源调度的,AppMaster根据提交的信息计算出MapTask的数量,根据例子为两个mapTasks,并启动mapTask;

5. 启动完mapTask之后,InputFormat里的RecoderReader去读取待处理数据,把数据返回给Mapper,map函数就会根据用户自定义的逻辑进行处理得到新的<k,v>;

6. 得到新的<k,v>对之后,会有collector进行收据数据;

7. 收集完成之后就会向一个环形缓冲区中写入数据(环形缓冲区默认大小100M内存)当写道80%的时候就会反向溢写到磁盘中;

8. 在环形缓冲区中会对数据进行分区 partition,然后再分区内部进行排序(因为不同分区会对应不同的reduceTask所以再内部分区就可以)通过使用快排算法按照字典顺序对key排序。

9. 完成之后把文件序列化溢写到磁盘形成一个个小文件。

10. 然后进行merge归并排序,意思时按照分区,对属于同一个分区内的小文件合并之后再进行排序。

11. 当所有的mapTask完成之后,Appmaster启动相应分区数量的reduceTask处理数据

12. reduceTask复制mapTask已经归并排序好的数据,将相同分区的数据放在同一个reduceTask的本地磁盘中。

13. 将不同mapTask中的partition数据复制到同一个reduceTask之后需要在将多个小文件进行合并排序为一个大文件

14. 然后按照相同key作为一组数据做reduce处理,处理完成之后,然后将最后结果写到指定位置。

下面是一个图片参考帮助理解(上面的处理步骤的数字和下图上的数字不是一一对应的)

 

 shuffle机制

Map 方法之后,Reduce 方法之前的数据处理过程称之为 Shuffle

上图的流程是整个 MapReduce 最全工作流程,但是 Shuffle 过程只是从第 7 步开始到第 16 步结束,具体 Shuffle 过程详解,如下:

(1)MapTask 收集我们的 map()方法输出的 kv 对,放到内存缓冲区中

(2)从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件

(3)多个溢出文件会被合并成大的溢出文件

(4)在溢出过程及合并的过程中,都要调用 Partitioner 进行分区和针对 key 进行排序

(5)ReduceTask 根据自己的分区号,去各个 MapTask 机器上取相应的结果分区数据

(6)ReduceTask 会抓取到同一个分区的来自不同 MapTask 的结果文件,ReduceTask 会将这些文件再进行合并(归并排序)

(7)合并成大文件后,Shuffle 的过程也就结束了,后面进入 ReduceTask 的逻辑运算过 程(从文件中取出一个一个的键值对 Group,调用用户自定义的 reduce()方法)

注意: (1)Shuffle 中的缓冲区大小会影响到 MapReduce 程序的执行效率,原则上说,缓冲区 越大,磁盘 io 的次数越少,执行速度就越快。 (2)缓冲区的大小可以通过参数调整,参数:mapreduce.task.io.sort.mb 默认 100M。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值