1.MapTask阶段
1)准备一个200M的文件,submit中对该数据进行切片。 2)客户端向Yarn提交信息(job.split,wc.jar,job.xml),Yarn开启一个MrAppmaster,MrAppmaster读取客户端对应的信息,主要是job.split,然后根据切片个数,开启对应数量的MapTask。 3)MapTask通过InputFormat(默认TextInputFormat)去读取数据(默认按行读取),k是偏移量,v是一行内容,数据读取后交给Mapper,然后根据用户的业务需求来对数据进行处理。 4)数据处理后输送到环形缓冲区(默认100M),环形缓冲区一边是存数据,一边存的是索引(描述数据的元数据),环形缓冲区存储数据达到80%后进行反向溢写,并对数据进行分区,排序。 5)再对分区且区内有序的文件进行归并排序,然后存储到磁盘。
MapTask阶段共分为5个阶段
Read阶段
MapTask通过用户编写的RecordReader,从输入的Inputsplit中解析出一个个key/value。
Map阶段
将解析出来的key/value交给用户编写map()函数进行处理,并产生一系列新的key/value。
Collect阶段
在用户编写map函数中,当数据处理完成后,一般会调用OutputCollector.collect()输出结果,在这个函数内部,它会将生成的key/value分区(调用Partitioner),写入到环形缓冲区中。
溢写阶段
当环形缓冲区满后,MapReduce会将数据写入到本地磁盘上,生成一个临时文件,需要注意的是,将数据写入到本地磁盘前,先要对数据进行一次本地排序,并在必要时对数据进行合并,压缩等操作。
Merge阶段
当所有数据处理完后,MapTask对所有临时文件进行一次合并,以确保最终只会生成一个数据文件。
2.ReduceTask阶段
1)当所有MapTask任务完成后,启动相应数量的ReduceTask,并告知ReduceTask处理数据范围(数据分区),注意:不是必须等到所有MapTask结束后才开始,可以自行配置。 2)ReduceTask开启后,ReduceTask主动从MapTask对应的分区拉取数据。 3)再对ReduceTask拉取的数据进行一个全局合并排序。 4)顺序读取数据,按Key分,key相同的数据进入同一个Reducer,一次读取一组数据。 5)Reducer处理完数据,通过OutputFormat往外写数据,形成对应的文件。
ReduceTask阶段共分为三个阶段
Copy阶段
ReduceTask 从各个 MapTask 上远程拷贝一片数据,并针对某一片数据,如果其大小超过一定阈值,则写到磁盘上,否则直接放到内存中。
Sort阶段
在远程拷贝数据的同时,ReduceTask 启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上文件过多。按照 MapReduce 语义,用户编写 reduce()函数输入数据是按 key 进行聚集的一组数据。为了将 key 相同的数据聚在一起,Hadoop 采用了基于排序的策略。由于各个 MapTask 已经实现对自己的处理结果进行了局部排序,因此,ReduceTask 只需对所有数据进行一次归并排序即可。
Reduce阶段
reduce()函数将计算结果写到 HDFS 上。



