💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
![](https://img.kancloud.cn/12/3a/123a33704c87a7ad068ff249237e0207_1057x461.png) <br/> **1. split 阶段** 首先 mapreduce 会根据要运行的大文件来进行 split,每个输入分片(input split)针对一个 map 任务,<ins>输入分片(InputSplit)存储的并非数据本身</ins>,而是一个分片长度和一个记录数据位置的数组。输入分片(InputSplit)通常和 HDFS 的 block(块)关系很密切,假如我们设定 HDFS 的块的大小是 128MB,我们运行的大文件是128x10MB,MapReduce 会分为 10 个 MapTask,每个 MapTask 都尽可能运行在block(块)所在的 DataNode 上,体现了<ins>移动计算不移动数据的思想</ins>。 <br/> **2. map 阶段** map 阶段就是执行自己编写的 Mapper 类中的 map 函数,Map 过程开始处理,MapTask 会接受输入分片,通过不断的调用 map()方法对数据进行处理。处理完毕后,转换为新的`<KEY,VALUE>`键值对输出。 <br/> **3. Shuffle 阶段** shuffle 阶段主要负责将 map 端生成的数据传递给 reduce 端,因此 shuffle 分为在 map 端的过程和在 reduce 端的执行过程。具体过程如下: (1)MapTask 收集 map()方法的输出<KEY,VALUE>对,放到<ins>内存缓冲区(称为环形缓冲区)</ins>中,其中环形缓冲区的大小默认是 100MB。 (2)环形缓冲区到达一定阈值(环形缓冲区大小的 80%)时,<ins>会将缓冲区中的数据溢出本地磁盘文件</ins>,这个过程中可能会溢出多个文件。 (3)多个溢出文件会被合并成大的溢出文件。 (4)在溢出过程及合并的过程中,都要调用 Partitioner 进行分区和针对 key进行排序 sort。 (5)合并成大文件后,Map 端 shuffle 的过程也就结束了,后面进入 reduce端 shuffle 的过程。 (6)在 Reduce 端,shuffle 主要分为复制 Map 输出(copy)、排序合并(Merge Sort)两个阶段。 <br/> Reduce 任务通过 HTTP 向各个 Map 任务拖取它所需要的数据。 Copy 过来的数据会先放入内存缓冲区中,如果内存缓冲区中能放得下这次数据的话就直接把数据写到内存中,即内存到内存 merge。Reduce 要向每个 Map去拖取数据,在内存中每个 Map 对应一块数据,当内存缓存区中存储的 Map 数据占用空间达到一定程度的时候,开始启动内存中 merge,把内存中的数据 merge输出到磁盘上一个文件中,即内存到磁盘 merge。<br/> 当属于该 reducer 的 map 输出全部拷贝完成,则会在 reducer 上生成多个文件(如果拖取的所有 map 数据总量都没有超出内存缓冲区,则数据就只存在于内存中),这时开始执行合并操作,即磁盘到磁盘 merge。 <br/> **4. Reduce 阶段** Reduce 从合并的文件中取出一个一个的键值对 group,调用用户自定义的`reduce()`方法,生成最终的输出文件。 <br/> **注意:** Shuffle中的缓冲区大小会影响到MapReduce程序的执行效率,原则上说,缓冲区越大,磁盘io的次数越少,执行速度就越快。 缓冲区的大小可以通过参数调整,参数:`io.sort.mb` 默认 100M。