MapReduce框架结构及核心运行机制
- MRAppMaster : 负责整个程序的运行过程的调度和状态协调
- MapTask : 负责map阶段的整个数据处理流程
- ReduceTask : 负责reduce阶段的整个数据处理流程
整体流程图
MapReduce详细工作流程
- Map阶段 : 并行处理输入数据
- Reduce阶段 : 对Map进行汇总,其中MapTask的计算流程
- Read阶段 : MapTask通过用户编写的RecordReade,从输入IntputSplit中解析出一个个kv
- Map阶段 : 该节点主要是将解析的kv交给用户编写map()函数处理,并产生一系列新的kv
- Collect收集阶段 : 在用户编写map()函数时,当数据处理完后,一般会调用OutputCollector.collect()输出结果,在该函数内部,他将会生成kv的分区(调用Partitioner),并且写入一个环形内存缓存区中
- Spill阶段 : 当环形缓冲区满后,MR会将数据写到本地磁盘上,生成一个临时文件,需要注意的是讲数据写入本地磁盘之前,要先对数据进行一次本地排序,并且在必要时对数据进行合并,压缩等操作.溢写阶段详情:
- 步骤1 : 利用快排队缓存区内存的数据进行排序,排序方式是先按照分区编号Partition进行排序,然后按照key进行排序.这样那,经过排序后,数据以分区为单位聚集在一起,并且统一分区内的所有数据按照key有序 - 步骤2 : 按照分区编号由小到大一次将每个分区中的数据写入任务工作目录下的临时文件夹 output/spillN.out( N 表示当前溢写次数).如果用户设置了Combiner,则在写入文件之前,对每个分区的文件进行一次聚集操作. - 步骤3 : 将分区数据的元信息写到内存索引数据结构SpillRecord中,其中每个分区的元信息包括在临时文件中的偏移量,压缩前数据大小和压缩后数据大小.如果当前内存索引大小超过1MB,则将内存索引写到文件output/spillN.oput.index中 - Combine阶段 : 当所有数据处理完之后,MapTask对所有文件进行一次合并,以确保最终只会生成一个数据文件.当所有数据处理完之后,MapTask会把所有临时文件合并成一个大文件,并且保存到output/file.out中,同时生成相应的索引文件outpuit/file.out.index.在文件进行合并的过程中,MapTask以分区为单位进行合并,对于某个分区它将采用多伦递归合并的方式,每轮合并io.sort.factor(默认10)文件,并且将重新产生的文件重新加入待合并列表中,对文件进行排序后,重复以上过程,直到最终得到一个大文件.让每个MapTask最终只生成一个数据文件,可以避免同时打开大量文件和同时去读大量小文件产生的随机读取带来的开销.
Shuffle关键流程解析
- Map Task 收集我们的map()方法输出的KV对,放到内存缓冲区中
- 从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件
- 多个溢出的文件会被合并成大文件
- 在溢出及合并的过程中,都要调用Partitioner进行分区和针对key进行排序
- ReduceTask会根据自己得分区号,去各个MapTask机器上取相应的结果分区数据
- ReduceTask会获取到同一个分区的来自不同MapTask的结果文件,ReduceTask会对这些文件进行合并(归并排序)
- 合并成大文件之后,Shuffle的过程也就结束了,后面进入ReduceTask的逻辑运算过程
其中ReduceTask的处理流程如下 :
- Copy阶段 : ReduceTask从各个MapTask上远程拷贝一片数据,并且针对某一片数据,如果其大小超出阈值,则写到磁盘上,否则直接放到内存中.
- Merge阶段 : 在远程拷贝数据的同时,ReduceTask启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或者磁盘上文件过多.
- Sort阶段 : 根据MapReduce,用户表编写reduce函数输入数据是按照key进行聚集的一组数据.为了把key相同的数据聚集在一起,Hadoop采用了基于排序的策略.由于各个MapTask以及实现对自己的处理结果进行了局部排序,因此ReduceTask只需要对所有数据进行一次归并排序即可.
- Reduce阶段 : reduce函数将结果上传到HDFS上
总结
优点 : 易于编程,扩展性高,高容错性,适合PB以上海量离线数据处理,可实现上前台服务器集群并发工作
缺点 : 不擅长实时计算,反应慢.不适合流式计算,因为MR是静态的,流式计算输入数据必须是动态的,不擅长DAG(有向图)计算,多个应用程序存在依赖关系,后一个应用程序作为前一个的输出,在做的时候会造成大量的磁盘io开销,性能非常低下.
|