MapReduce源码解析之Map端的输入输出【小二讲堂】

本文深入解析MapReduce的源码,详细介绍了Map输入端的工作原理,包括Mapper类的run方法执行流程,自定义map方法的逻辑处理,以及MapTask如何处理作业。同时,探讨了Map输出端的数据处理过程,如分区、排序、环形缓冲区的使用和溢写策略。

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

一、Map输入端

当作业进行切片后被提交到MR进行执行时,必须经过Mapper类的run方法进行任务的执行,这样我们在map端的自定义map方法也会执行,而根据业务需求我们可以对map端的输出进行业务逻辑的处理,以达到在Reduce我们对Map端处理的数据进行接收,并进行计算。
1.自定义类中继承Mapper类
在这里插入图片描述
2.进入mapper.class类中,我们可以看到有setup()方法,还有自定义类继承的map()方法,以及cleanup方法,最重要的当然是run方法了。

调用一次次setup()方法–可以做预处理,准备资源
map()业务执行:
首先判断context上下文对象中是否包含key和vlaue,如果有则开始调用map()方法,则在这里开始执行自定的map方法,进行自定义逻辑代码的运行,当上下文对象中没有值时,跳出循环,执行cleanup方法,结束执行。
在每循环一次时,会将congtext对象的key和value传递,然后我们对key和value进行自己的逻辑处理
cleanup()清除申请的资源
将map端执行的结果进行发送输出
在这里插入图片描述
一、MapTask
到这里那么map端的资源时怎么过来的呢?当作业提交完成时(这里前面一节说过了),在分配到container容器之后,会执行MapTask,Reduce Task,MapTask会拿着container所提交上来的job作业进行处理。下面从MapTask执行开始解析
1.run方法的执行
在这里插入图片描述
首先会进行检查是否是mapTask任务,这里当然是了
然后获取配置文件中的reduce数量,如果reduce数量为0,则map端的输出直接输出的存储系统中,这里是可以没有reduce。
然后开始执行map阶段的任务,进行mapPhase进行数据的映射,和排序。
继续执行
在这里插入图片描述
到这里进行判断是否用新的API执行作业,当然是了。
2.在调用run方法时,将job,splitmetainfo,umbilical.reporter作为参数传递给runNewMapper()方法
然后执行一系列的初始化方法
-创建输入格式化类-默认情况是TextInputFormat
-获取切片信息,包括,文件名称,偏移量offset,切片的大小size,location切片位置信息
-创建RecordReader(split,taskContext),将数据切片的信息和taskContext上下文对象的信息进行传递
进入RecordReader中----TextInputFormat

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值