hadoop的shuffle过程

博客详细介绍了Hadoop Shuffle过程,包括Collect、Spill、Merge、Copy、Merge和Sort阶段,强调了缓冲区大小对效率的影响以及Map和Reduce端的具体操作。Map端涉及数据的分区、排序和Combiner,而Reduce端则涉及数据的获取和归并排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Shuffle 的执行阶段流程

1).Collect 阶段:将 MapTask 的结果输出到默认大小为 100M 的环形缓冲区,保存的是 key/value 序列化数据,Partition 分区信息等。

2).Spill 阶段:当内存中的数据量达到一定的阀值的时候,就会将数据写入本地磁盘,在将数据写入磁盘之前需要对数据进行一次排序的操作,如果配置了 combiner,还会将有相同分区号和 key 的数据进行排序。

3).Merge 阶段:把所有溢出的临时文件进行一次合并操作,以确保一个 MapTask 最终只产生一个中间数据文件。

4).Copy 阶段: ReduceTask 启动 Fetcher 线程到已经完成 MapTask 的节点上复制一份属于自己的数据,这些数据默认会保存在内存的缓冲区中,当内存的缓冲区达到一定的阀值的时候,就会将数据写到磁盘之上。

5).Merge 阶段:在 ReduceTask 远程复制数据的同时,会在后台开启两个线程 (一个是内存到磁盘的合并,一个是磁盘到磁盘的合并) 对内存到本地的数据文件进行合并操作。

6).Sort 阶段:在对数据进行合并的同时,会进行排序操作,由于 MapTask 阶段已经对数据进行了局部的排序,ReduceTask 只需保证 Copy 的数据的最终整体有效性即可

总结
Shuffle 的大致流程为:Maptask 会不断收集我们的 map () 方法输出的 kv 对,放到内存缓冲区中,当缓冲区达到饱和的时候 (默认占比为 0.8) 就会溢出到磁盘中,如果 map 的输出结果很多,则会有多个溢出文件,多个溢出文件会被合并成一个大的溢出文件,在文件溢出、合并的过程中,都要调用 partitoner 进行分组和针对 key 进行排序 (默认是按照 Key 的 hash 值对 Partitoner 个数取模),之后 reducetask 根据自己的分区号,去各个 maptask 机器上取相应的结果分区数据,reducetask 会将这些文件再进行合并(归并排序)。

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

注意
Shuffle 中的缓冲区大小会影响到 mapreduce 程序的执行效率,原则上说,缓冲区越大,磁盘 io 的次数越少,执行速度就越快,正是因为 Shuffle 的过程中要不断的将文件从磁盘写入到内存,再从内存写入到磁盘,从而导致了 Hadoop 中 MapReduce 执行效率相对于 Storm 等一些实时计算来说比较低下的原因。

另一个总结:
Hadoop 的 shuffle 过程分为 Map 端和 Reduce 端。

Map 端:Map 端会处理输入数据并产生中间结果,这个中间结果会写到本地磁盘,而不是 HDFS。每个 Map 的输出会先写到内存缓冲区中,当写入的数据达到设定的阈值时,系统将会启动一个线程将缓冲区的数据写到磁盘,这个过程叫做 spill。

在 spill 写入之前,会先进行二次排序,首先根据数据所属的 partition 进行排序,然后每个 partition 中的数据再按 key 来排序。partition 的目是将记录划分到不同的 Reducer 上去,以期望能够达到负载均衡,以后的 Reducer 就会根据 partition 来读取自己对应的数据。接着运行 combiner (如果设置了的话),combiner 的本质也是一个 Reducer,其目的是对将要写入到磁盘上的文件先进行一次处理,这样,写入到磁盘的数据量就会减少。最后将数据写到本地磁盘产生 spill 文件 (spill 文件保存在 {mapred.local.dir} 指定的目录中,Map 任务结束后就会被删除)。

最后,每个 Map 任务可能产生多个 spill 文件,在每个 Map 任务完成前,会通过多路归并算法将这些 spill 文件归并成一个文件。至此,Map 的 shuffle 过程就结束了。

Reduce 端:reduceTask 根据自己的分区号,去各个 mapTask 机器上取相应的结果分区文件,reduceTask 会取到同一个分区的来自不同 mapTask 的结果文件,reduceTask 会将这些文件再进行合并(归并排序)。至此,Reduce 的 shuffle 过程就结束了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值