MapReduce之Shuffle执行原理

MapReduce的Shuffle阶段是连接Mapper和Reducer的关键,包括数据分区、排序和局部聚合。它按照Partitioner规则将MapTask的输出分发给ReduceTask,期间对数据按key进行分区和排序。主要流程包含分区、排序和Combiner(可选)。在内存缓冲区满时,数据溢出到磁盘并合并,同时进行分区和排序。ReduceTask则从各MapTask获取对应分区数据,再次进行合并,最终进入reduce逻辑运算。

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

MapReduce 的 Shuffle 机制

1.1、概述

1、MapReduce 中,mapper 阶段处理的数据如何传递给 reducer 阶段,是 MapReduce 框架中 最关键的一个流程,这个流程就叫 Shuffle

2、Shuffle: 数据混洗 ——(核心机制:数据分区,排序,分组,局部聚合,缓存,拉取,再合并 排序)

3、具体来说:就是将 MapTask 输出的处理结果数据,按照 Partitioner 组件制定的规则分发 给 ReduceTask,并在分发的过程中,对数据按 key 进行了分区和排序

1.2、主要流程

Shuffle 是 MapReduce 处理流程中的一个核心过程,它的每一个处理步骤是分散在各个 map task 和 reduce task 节点上完成的,整体来看,分为核心 3 个操作:

1、分区 partition(如果 reduceTask 只有一个或者没有,那么 partition 将不起作用。设置没 设置都相当于没有)

2、Sort 根据 key 排序(MapReduce 编程中的 sort 是一定会做的,并且只能按照 key 排序, 当然如果没有 reducer 阶段,那么就不会对 key 排序) ,之后会按照排序的key值进行分组,将相同key的值放到同一组

3、Combiner 进行局部 value 的合并(Combiner 是可选的组件,作用只是为了提高任务的执 行效率)

1.3、详细流程

1、mapTask 收集我们的 map()方法输出的 kv 对,放到内存缓冲区 kvbuffer(环形缓冲区:内 存中的一种首尾相连的数据结构,kvbuffer 包含数据区和索引区)中

2、从内存缓冲区中的数据区的数据不断溢出本地磁盘文件 file.out,可能会溢出多次,则会 有多个文件,相应的内存缓冲区中的索引区数据溢出为磁盘索引文件 file.out.index

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

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

5、在数据量大的时候,可以对 mapTask 结果启用压缩,将 mapreduce.map.output.compress 设为 true,并使用 mapreduce.map.output.compress.codec 设置使用的压缩算法,可以提高数 据传输到 reducer 端的效率

6、reduceTask 根据自己的分区号,去各个 mapTask 机器上取相应的结果分区数据

7、reduceTask 会取到同一个分区的来自不同 mapTask 的结果文件,reduceTask 会将这些文 件再进行合并(归并排序)

8、合并成大文件后,shuffle 的过程也就结束了,后面进入 reduceTask 的逻辑运算过程(从 文件中取出一个一个的键值对 group,调用用户自定义的 reduce()方法) Shuffle 中的缓冲区大小会影响到 mapreduce 程序的执行效率,原则上说,缓冲区越大,磁 盘 io 的次数越少,执行速度就越快 缓冲区的大小可以通过参数调整:

参数:mapreduce.task.io.sort.mb 默认 100M 缓冲区的溢写比也可以通过参数调整

参数:mapreduce.map.sort.spill.percent 默认 0.8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值