详细步骤:
1、客户端会提交相应的切片、jar包、配置文件信息到Yarn上,Yarn上的AppMater会为mapreduce申请相应的资源;
2、AppMater根据相关信息计算给mapreduce程序分配出几个MapTask资源。
3、 MapTask会利用InputFormat中的recorderReader将待处理的文本分割成<k,v>键值对的形式,然后根据用户自定义的Map方法进行逻辑计算输出到collector;
4、collector中有一个环形缓冲区(默认内存为100M),它从中一分为二,一边存储着<k,v>键值对数据,另一边存储着这些数据的索引,当环形缓冲区的存储值达到容量的80%时,会发生溢写并在另一端反向写入,这样做的好处就是可以源源不断的向其中写入数据,而不必在开辟其他空间,大大提高执行效率。
5、溢写过程中会产生分区,每个分区内的数据会进行一次快速排序,将分区内的数据按字典顺序排列。
6、每次溢写会产生一个小文件,进而生成多个小文件,在这个过程中可能会发生combiner(这是用户可选的),combiner的作用就是将key相同的键值对进行一个合并,相当于聚合操作,也等同于一个小的reducer。这样做到好处就是减少了Map端到reduce端的传输量。
7、此阶段会发生合并文件及归并排序,目的是将不同文件中相同分区内的数据按照顺序放在一个分区中,并将多个小文件合并成一个大文件,方便传输到reduce端;
8、reduce端会将所有map端属于自己分区的文件拷贝到自己的服务端;
9、拷贝过来的文件会发生一次合并然后进行归并排序,目的是将所有key相同的数据放在一起,好进行reducer()方法,此过程中还可能发生分组也是用户自定义项,用的场景不多,这里就不多做解释;
10、这里会将key相同的一组数据放入reducer()方法中进行用户自定义的聚合操作;
11、处理后的文本会由OutputFormat中的recorderWrite写入文件落入磁盘中。
到此整个MapReduce程序的运行机制就算完成了。