MapReduce运行全流程

来源:互联网 发布:小米4c可以4g网络吗 编辑:程序博客网 时间:2024/05/17 09:16

MapReduce运行全流程:

NodemanagerResourcemanager那里拿到Task之后,就启动一个规定cpu、内存的container用来运行MapTask

 

那么MapTask就开始工作了,MapTask通过Inputformat组件,从任务所指定路径(:HDFS)上开始读取数据。需注意的是,他一次只读一行,读完一行调一次用户写的Map方法,数据格式为<K,V>,其中K为起始偏移量(按字节来算)V为那一行的内容。<K,V>经过用户的Map逻辑处理后,通过上下文context.write()将处理后得到的<K,V>写出去。

 

此时有一个组件OutPutCollector将写出的数据,写到一个环形缓冲区中,这个环形缓冲区可以实现异步工作,提高了程序的工作效率。

 

这个环形缓冲区,默认当数据占到80%的时候,就发生split溢出,溢出的时候通过HashPartitionerKey.CompareTo进行分区、排序。于此同时,程序继续往剩下的20%<K,V>。如下图:


溢出到文件的时候,会调用用户定义的combiner组件,对相同KV进行combiner,然后再写到文件中去。这里会源源不断的溢出文件,从上一个溢出位置开始,每满80%就开始溢出。那么就会有很多文件,此时就会调用归并排序,将他们归并起来形成一个大文件。如果此时发现用户定义了combiner,就会调用combiner形成最终的结果文件。如下图:


与此同时,还有很多MapTask在运行,他们都运行完了后。AppMaster会知道,因为AppMaster时刻都在监控着这些MapTask,他们一完成AppMaster马上向resourcemanager申请新的container来运行reduce的任务。

 

Nodemanager领取到任务后,首先从多个MapTask上下载自己分区的结果文件到reduceTask本地磁盘的工作目录。然后进行归并排序。然后通过GroupingComparaor(k,nextk)组件,判断哪些数据为一组<k1,v1>  <k1,v2>  <k1,v3>


最后将数据传给reduce逻辑处理,数据的格式为<K,Values>,其中K为一组<k1,v1>  <k1,v2>  <k1,v3>中的第一个K。逻辑处理后,context.write()写出去,最后通过OutPutFormat写到HDFS上。


原创粉丝点击