本节我们主要看一下Map Task和Reduce Task的执行流程:
好了,接下来我们再看看Map Task和Reduce Task的一个完整的执行流程:
1)、TaskNode节点启动分配JobTracker个Map Task任务,启用InputFormat对象(具体为RecordReader)读取分配给本节点split分片,将每一行的数据读取成key/value键值对;
2)、mapper程序的map()函数会接收key/value键值对的数据,做逻辑处理,然后将之输出;
3)、(开始MapReduce的shuffle过程,该过程的性能的好坏可以直接决定MapReduce的性能。)mapper程序会将经处理过的key/value数据先加入该Task的环形的内存缓冲区,直到达到缓存达到阀值,然后会将数据spill到linux的本地磁盘上(注意,这些中间数据不会被保存到HDFS),生成一个磁盘文件;
4)、mapper处理玩自己分片的数据后,会将磁盘上的所有spill文件合并;
5)、当一个Map Task任务处理完后,TaskTracker节点会告诉JobTracker节点任务执行完毕并等待新的任务,然后JobTracker会告知reducer程序,区获取属于reducer自己的数据;
(注:第3 - 5步是Map断的shuffle阶段。)
6)、reducer通过多线程(默认为5个copy线程)开始到已执行完成的mapper节点上copy属于自己的partition数据;
7)、reducer会先将copy的数据先放在本机的内存缓存中,合并拷贝数据,当缓存中放不下copy数据时,会将内丛中的的数据刷新到磁盘上,数据copy完成后,会将虽有数据合并成一个大文件,数据格式由原来的<key,value>变成<key,value list>;
8)、将合并后的文件排序;
(注:第6 - 8步是Map断的shuffle阶段。)
9)、接下来reducer开始执行业务逻辑处理的reduce()方法,并将数据最终输出到HDFS上。
10)、所有的Task都执行完成后,整个处理过程完成。