shuffle流程理解

 shuffle流程理解

  什么是shuffle流程?

  MapReduce确保每个reducer的输入都是按键排序的。系统执行排序,将map输出作为输入传给reducer的过程称为shuffle.

  简单来说就是:从map输出开始,到reduce输入之前这个阶段。

  如下图所示:

 

如图所示大致分为5个阶段:

1.Collect阶段 2.Spill阶段 3.Merge阶段 (属于Map端)

4.Fetch阶段 5.Merge阶段(属于reduce端)

 

1.Collect阶段:


每个map任务的结果输出到缓冲区中(默认大小为100M的环形缓冲区)

备注:每个map任务都有一个环形内存缓冲区用于存储任务输出。在默认情况下,缓冲区的大小为100MB,

这个值可以通过mapreduce.task.io.sort.mb属性来调整。一旦缓冲内容值达到阀值(mapreduce.map.sort.spill.percent,默认为0.80,或80%)

一个后台线程便开始把内容从内存溢写(spill)到磁盘。如下所诉Spill阶段


2.Spill阶段:

(在写入磁盘之前,线程会在内存进行分区;在每个分区中进行排序。如果配置了combiner函数,还会将有相同分区号的key的数据进行排序,使得map输出更加紧凑)
当缓冲区内存中的数据达到阀值的时候,就会将数据溢写到本地磁盘(
溢写线程启动,锁定这百分之80的内存,执行溢写过程。
map任务还可以往这剩下的20M内存中写),产生溢写文件。但如果在此期间缓冲区被填满(剩下的百分之20),map会被阻塞直到写磁盘过程完成。将将缓冲区的内容写道mapreduce.cluster.local.dir属性指定的目录中。

 


3.Merge阶段


在map任务写完最后一个输出记录后,会有几个溢出文件被合并成一个已分区且已排序的输出文件。
将同一分区的数据聚集,把所有溢出写的临时文件进行一次合并
以确保一个MapTask最终只产生一个中间数据文件。

>配置属性mapreduce.task.io.sort.factor控制一次最多能合并多少个文件,默认值是10.
 


4.Fetch阶段:


reduce端的线程通过Http协议复制当前reduceTask要处理的分区数据,先复制到内存中的缓存中,
根据缓存大小来决定是否产生文件,如果map输出小,会被复制到reduce任务JVM内存,
当内存的缓存区达到一定的阀值时,就会将数据写到磁盘上


5.Merge阶段:


reduce端会合并多个文件,在对数据进行合并的同时,会进行排序操作,
由于Map阶段已经对数据进行了布局的排序,reduce任务只需保证复制的整体性和有效性即可
最后一次合并不产生文件,直接在内存中输入reduce

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值