Hadoop(8) MapReduce-1 MapReduce的详细流程和Shuffle机制的流程
文章目录
MapReduce的详细流程
MapReduce的流程
整个MapReduce可以分为两个阶段: MapTask 和 Reducetask ,其中Input->Mapper的阶段为MapTask,Reducer->output的阶段为ReduceTask
整个MapReduce详细流程
Mapper
- 首先客户端从指定的输入文件夹读取文件信息, 根据参数配置生成一个任务规划(切片规划, 不是真正的切片)
- 客户端从服务端获取服务器的部分配置, 和提交路径, 以及一个job的全局唯一ID
- 客户端将任务规划发送到Yarn中, Yarn根据任务规划计算出所需的MapTask数量(一个切片对应一个MapTask)
- 客户端根据InputFormat(默认是TextInputFormat)里的定义的切片规则将文件切片(split), 每个切片对应一个MapTask
- RecorderReader将对应的切片的内容读取成一个个的键值对, 然后将这些键值对传给MapTask
- MapTask执行map逻辑(每个键值对调用一次map()方法)
- 每个MapTask将输出内容输出到一个缓冲区(内存)
- 在缓冲去中对数据进行分区(partition) 和排序(WritableComparable), 从而根据需求生成不同的分区, 每个分区中的数据是有序的
- 在这个缓冲区默认大小为100M(可以通过io.sort.mb来进行调节), 如果到达临界值时会发生溢写(spill), 将缓冲区内的内容写出到磁盘文件中, 如果定义了Combine, 在这时会进行一次combine
- 当整个mapper输出结束后, 对所有的溢出文件进行一次归并排序(Merge), 使每个分区的所有内容有序排列, 同时进行合并(Merge)
- 合并: 对各个不同文件中相同的分区合成一个分区, 如果定义了Combine, 在这里还会进行一次combine
Reducer
- 上面5-11步骤是一个MapTask执行的内容, 当所有MapTask的任务完成之后, 根据MapTask的分区数量, 启动相应数量的ReduceTask(注意是一个分区对应一个ReduceTask, 而不是一个MapTask对弈一个ReduceTask)
- ReduceTask将每个分区的内容下载到自己的磁盘
- 然后再对不同MapTask传递过来的分区文件再进行一次归并排序
- ReduceTask根据**分组规则(GroupingComparator)**进行分组, 然后分组次读入ReduceTask进行处理
- ReduceTask处理完数据之后, 根据OutputFormat(默认是TextOutpuFormat)进行输出
Shuffle机制的流程
Shuffle过程指的就是数据从MapTask输出之后, 到达ReduceTask之前的一系列分组, 排序, 合并的过程, 具体Shuffle流程就是上面流程的7-14步, 流程图如下: