Mapreduce的Maptask的运行机制

上一篇讲解了hadoop2.0当中Mapreduce是如何运行的,知道MRAppMaster通过调用yarn节点管理器启动一个节点容器来运行Map任务和reduce任务。本篇文章来详解讲解一下Map任务是如何运行的。

Mapreduce中Map任务的运行机制

read阶段:

任务节点根据客户端程序代码中编写的待处理的数据。然后根据任务提交的配置信息来计算需要的maptask的数据。然后Maptask的第一个阶段就是读的阶段,从待处理的分片数据(inputSplit)当中读出一个个键值对key/value。

Map阶段:

通过用户程序编写的Map()函数处理,把read阶段解析处理的键值对进行处理,再产生一系列新的键值对。

Collect阶段:

在调用完map()函数,会调用outputCollector对map的结果进行分区处理(partitioner),并写入到内存缓冲区中。

溢写阶段:

当缓冲区满了,maptask会将缓冲区的数据“溢写“到本地磁盘上,生成一个spillN.out(其中N代表溢写的次数)的文件。

1、利用快速排序算法对缓存区内的数据进行排序,按照分区编号Partition(先)、分区内的key(后)进行排序,把数据以分区为单位聚集在一起,同时分区内的key是有序的。

2、然后按照分区编号的大小,由小到大依次写入到spillN.out临时文件当中。假如用户程序编写了combiner函数,那么在写入之前还会根据用户的需求对分区数据进行一次聚集处理。

3、将分区数据的元信息写到内存索引数据结构SpillRecord中,主要是元数据在临时文件中的位置、压缩前数据大小和压缩后数据大小。如果当前内存索引大小超过1MB,将会把内存索引写到文件spillN.out.index中。

Combine阶段

当数据处理完后,MapTask会将所有临时文件进行合并,合并成一个大文件保存到文件output/file.out中,同时生成相应的索引文件output/file.out.index。在进行文件合并过程中,MapTask以分区为单位进行合并。