目录
1、MapReduce工作流程
流程示意图:
1.1 split 阶段
- 首先 mapreduce 会根据要运行的大文件来进行 split,每个输入分片(inputsplit)针对一个 map
任务,输入分片(InputSplit)存储的并非数据本身,而是一个分片长度和一个记录数据位置的数组。 - 输入分片(InputSplit)通常和 HDFS 的 block(块)关系很密切,假如我们设定 HDFS 的块的大小是
128MB,我们运行的大文件是128x10MB,MapReduce 会分为 10 个 MapTask,每个 MapTask
都尽可能运行在block(块)所在的 DataNode 上,体现了移动计算不移动数据的思想。
1.2 map 阶段
- map 阶段就是执行自己编写的 Mapper 类中的 map 函数,Map 过程开始处理,MapTask 会接受输入分片,通过不断的调用map()方法对数据进行处理。处理完毕后,转换为新的<KEY,VALUE>键值对输出。
1.3 Shuffle 阶段(面试重点)
- shuffle 阶段主要负责将 map 端生成的数据传递给 reduce 端,因此 shuffle 分为在 map 端的过程和在reduce 端的执行过程。具体过程如下:
- (1)MapTask 收集map()方法的输出<KEY,VALUE>对,放到内存缓冲区(称为环形缓冲区)中,其中环形缓冲区的大小默认是100MB。
- (2)环形缓冲区到达一定阈值(环形缓冲区大小的 80%)时,会将缓冲区中的数据溢出本地磁盘文件,这个过程中可能会溢出多个文件。
- (3)多个溢出文件会被合并成大的溢出文件。
- (4)在溢出过程及合并的过程中,都要调用 Partitioner 进行分区和针对 key 进行排序 sort。
- (5)合并成大文件后,Map 端 shuffle 的过程也就结束了,后面进入 reduce 端 shuffle 的过程。
- (6)在 Reduce 端,shuffle 主要分为复制 Map 输出(copy)、排序合并(Merge Sort)两个阶段。
- Reduce 任务通过 HTTP 向各个 Map 任务拖取它所需要的数据。
- Copy 过来的数据会先放入内存缓冲区中,如果内存缓冲区中能放得下这次 数据的话就直接把数据写到内存中,即内存到内存merge。Reduce 要向每个 Map 去拖取数据,在内存中每个 Map 对应一块数据,当内存缓存区中存储的 Map 数据占用空间达到一定程度的时候,开始启动内存中 merge,把内存中的数据 merge 输出到磁盘上一个文件中,即内存到磁盘 merge。
- 当属于该 re