MapReduce运行全流程

本文详细介绍了MapReduce的运行流程,包括Nodemanager如何获取任务并启动Container运行MapTask,MapTask如何读取数据并调用用户编写的Map方法,以及溢出、归并排序、ReduceTask的工作原理等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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上。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值