Hadoop-MapReduc Shuffle过程

在这里插入图片描述

过程介绍

  • 假如在hdfs中存储一个300M文件,每个block的大小默认为128M,而且默认的切片大小也是128M,因此,每一个MapTask任务会处理一个split,则是有三个MapTask并行处理。
    • 一个 mr 程序启动的时候,最先启动的是 MRAppMaster,MRAppMaster 启动后根据本次job 的描述信息,计算出需要的 maptask 实例数量,然后向集群申请机器启动相应数量的maptask 进程
  • 每一个MapTask任务处理完成后,会通过收集器,将输出的结果存入一个环形缓冲区中,写入的过程会经过简单的排序,这个环形缓冲区的默认是100M,当环形缓冲区的大小使用超过80%,一个后台线程就会启动把环形缓冲区中的数据写入到磁盘文件,同时Map会继续向环形缓冲区中写入数据。
    环形缓冲去的工作原理
    • 环形缓冲区的大小默认为100M(可以配置mapred-site.xml:mapreduce.task.io.sort.mb)
    • 环形缓冲区的阈值为:80%((mapred-site.xml:mapreduce.map.sort.spill.percent,默认80%)
    • 在环形缓冲区中,存储了两种数据,一个是元数据分区号,map的key的起始位置,map的value的起始位置,map的value的长度(每一个元数据长度为4个int长度,长度固定)
      一种是原始数据:存放map的key和value
    • 在存储原始数据和元数据的时候,会将元数据和原始数据中间建立一个赤道,分割二者,然后不断的向两端写入数据,在环形缓冲区的数据写入到80%的时候,将这些数据锁定,然后向硬盘中溢写成小文件,同时环形缓冲区的剩下的部分仍然可以写数据,直到溢写结束,锁定释放,继续可以将元数据和原始数据写入缓冲区中。
  • 缓冲区溢写小文件:在溢写小文件的时候,会对缓冲区中的元数据根据分区号和key进行排序,然后根据排序好的元数据,溢写相应的原始数据(这是因为元数据的大小是固定的,比直接排序原始数据更容易),这样最后就会溢写出多个已经根据分区和key排序好的小文件(这里可以加入conbiner)
  • 对溢写后的小文件进行归并:此时会将溢写后的小文件进行归并成一个大文件(使用归并排序),此时合并的大文件已经按照分区和key排好序,
  • reduce拉取相应的数据:Reducer 中的一个线程定期向MRAppMaster询问Mapper输出结果文件位置,mapper结束后会向MRAppMaster汇报信息,从而 Reducer 得知 Mapper 状态,得到 map 结果文件目录;reduce会相应的拉取相同分区的小文件到本地
  • 然后会将拉取得到的相应的相同分区的小文件,进行归并排序合并成为一个有序的大文件(相同的key在一起)。
  • 然后根据分组规则,相同的key为一组调用一次reduce方法,处理数据
  • 最终将结果数据根据分区写入到不同的分区文件中。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值