shuffle流程简介

官方流程图:
流程图
Shuffle是MapReduce处理流程中的一个核心过程,它的每一个处理步骤是分散在maptask和reducetask节点上完成的,整体来看,分为3个核心操作:
1、分区partition
2、排序sort
3、合并combine

详细流程:
一、MAP
一个切片对应一个Maptask
1、分区(可参考:MapReduce切片、并行度、分区
在将map()函数处理后得到的(key,value)对写入到缓冲区之前,需要先进行分区操作,这样就能把map任务处理的结果发送给指定的reducer去执行,从而达到负载均衡,避免数据倾斜。

2、写入环形内存缓冲区
a、原始数据:map任务输出的键值对(默认大小100MB,mapreduce.task.io.sort.mb调整)
b、元数据:key、value的起始位置,value的长度,分区信息(这条数据属于哪个分区)

3、执行溢写出
1)溢写要求
缓冲区内容达到阈值(mapreduce.map.io.sort.spill.percent,默认0.80,或者80%),就会会锁定这80%的内存,进行溢写;
2)溢写前排序:
a、将数据按照partition和key两个关键字进行排序,先按分区,再按key;
b、排序算法为快速排序;
c、排序的为元数据,原始数据不动。
3)combiner
如果客户端自定义了Combiner(相当于map阶段的reduce),则会在分区排序后到溢写出前自动调用combiner

4、归并merge
对同一个map任务产生的多个spill(溢写)文件进行归并生成最终的一个已分区且已排序的大文件

二、Reduce
一个分区对应一个reducetask
1、复制copy
Reduce进程启动一些数据copy线程,通过HTTP方式请求MapTask所在的NodeManager以获取输出文件。 Reducer在拷贝数据的时候只需拷贝与自己对应的partition中的数据。

NodeManager需要为分区文件运行reduce任务。并且reduce任务需要集群上若干个map任务的map输出作为其特殊的分区文件。而每个map任务的完成时间可能不同,因此只要有一个任务完成,reduce任务就开始复制其输出。

2、归并merge
一般Reduce是一边copy一边sort,即copy和sort两个阶段是重叠而不是完全分开的

3、分组
当一个reduce任务完成全部的复制和排序后,就会针对已根据键排好序的Key构造对应的Value迭代器。这时就要用到分组,默认的根据键分组,自定义的可是使用 job.setGroupingComparatorClass()方法设置分组函数类。对于默认分组来说,只要这个比较器比较的两个Key相同,它们就属于同一组,它们的 Value就会放在一个Value迭代器,而这个迭代器的Key使用属于同一个组的所有Key的第一个Key。

4、reduce
在reduce阶段,reduce()输入是所有的Key和它的Value迭代器。此阶段的输出直接写到输出文件系统,一般为HDFS。如果采用HDFS,由于NodeManager也运行数据节点,所以第一个块副本将被写到本地磁盘。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值