mapreduce全流程
MapReduce全流程之Map阶段
结合上图所绘,理解下列描述。
1、数据准备:包含 a至z字母的200MB文本文件(ss.txt)。
2、客户端进行submint()操作,将任务进行提交,并且为两个块文件,向Yarn平台申请资源分配
3、通过取得资源,计算出所处理的数据块的分片数个,从而得知maptask的数量
4、Maptask通过LineInputFormat中的LineRecorderReader组件对分片中的数据进行行读取,然后通过inputformat组件将数据读取到maptask中进行mapper过程。
5、Mapper过程处理后的数据通过context.write方法写出到outputCollector(输出收集器)中。
6、输出收集器将收集的数据导入环形缓冲区中,并且为不间断导入(缓冲区默认100m)
7、环形缓冲区一直在接收数据,当收集的数据占据缓冲区设置容量的80%(环形缓冲区的大小可设置),就进行溢出操作(溢出阈值也可设置)。在溢出操作的同时,outputCollector也在不断写入。此处可能因为写入过快,而导致写入操作等待,但概率很小。
8、在溢出时,会对本次溢出的数据进行分区(默认HashPartitioner)、排序(CompareTo)、合并(Combiner)等操作,其中可根据业务需求选择是否进行合并操作。
9、溢出后的数据会溢出到文件中(分区且有序的,且因为内存空间不足,会暂时写到磁盘中),是一个等于或者小于缓冲区大小80%的溢出文件,这时可根据业务设置,每当有一定数量的文件溢出时,就可以对这些数量的溢出文件进行归并排序操作,将几个溢出文件中的同分区中的数据进行合并在一起,并且排序。
MapReduce全流程之Reduce阶段
结合上图所绘,理解下列描述。
11、在有maptask完成作业时,所有的reducetask就会去maptsak生成的溢出文件对应的分区中取得数据。
12、当所有的maptask完成时,reducetask也会从溢出文件中读取完数据,所有的reducetask同时开始。
13、reducetask会对各个溢出文件取出的数据进行合并、归并排序操作,生成<key,values>的组数据,一个key对应一组数据。这时,我们也可以通过GroupingComparator()分组组件,将同一个key的数据,分为多个组(一般不进行此操作),
14、Reducer方法,从处理后的文件中一次读取一组数据,然后由一个reduce方法处理一组中的数据,将处理后的数据通过outputformat组件进行输出,写到指定文件中,一个reducetask生成一个文本文件。
15、当整个mapreduce过程结束后,ApplicationMaster进行收尾工作,删除掉生成在磁盘上的溢出文件,删除其他垃圾文件,最后自我了断。