这是我参与「第四届青训营 」笔记创作活动的第5天
MapReduce框架原理
(1)MrAppMaster: 负责整个程序的过程调度及状态协调;
(2)MapTask: 负责Map阶段的数据处理流程,并行运行,互不相干;
(3)ReduceTask: 负责Reduce阶段的的数据处理流程,并发实例互不相干,但数据依赖于上一阶段所有MapTask并发实例的输出
1. InputFormat数据输入
1.1 数据块与数据切片
数据块: Block是 HDFS 物理上把数据分成一块一块。数据块是 HDFS 存储数据的单位。
数据切片: 数据切片只是逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储。数据切片是MapReduce程序计算输入数据的单位,一个切片会对应启动一个MapTask。
切片机制:
(1) 简单地按照文件的内容长度进行切片;
(2) 切片时,默认等于Block大小;
(3) 切片时不考虑数据集整体,而是逐个针对每一个文件单独切片
1.2 数据切片与 MapTask 并行度决定机制
MapTask的并行度决定Map阶段的任务处理并发度,进而影响到整个Job的处理速度。
2. shuffle机制
Map方法之后,Reduce方法之前的数据处理过程称为 Shuffle。
Shuffle过程包含在Map和Reduce两端,即 Map shuffle 和 Reduce shuffle
Map shuffle:
对于Map输出的结果进行分区(partition)(按照Reduce的并行度进行分区,也就是key值对reduce进行hash计算)、collector(环形内存缓冲区KVBuffer)、排序(sort)(按照分区Id 排序,同一分区按照key值排序 默认升序)、分割(spill),然后将属于同一分区的输出合并(merge) 在一起并写在磁盘上,最终生成一个有序的分区文件。
Reduce shuffle:
当mapreduce任务提交后,reduce task就不断通过RPC从JobTracker那里获取map task是否完成的信息,如果获知某台TaskTracker上的map task执行完成,会通知父TaskTracker状态已经更新,TaskTracker进而通知JobTracker(这些通知在心跳机制中进行),Shuffle的后半段过程就开始启动。
主要经过 Copy,SortMerge两个阶段。
3. OutputFormat
- OutputFormat 是 MapReduce 输出的基类,所有实现MapReduce输出都实现了 OutputFormat 接口;
- 默认输出格式为 TextOutputFormat;
- 输出数据到 MySQL、HBase、Elasticsearch等存储框架中。