Map-input源码分析

本文聚焦大数据领域,对MapTask-input源码进行深入分析。详细阐述了MapTask的运行流程,包括输入格式化类、切片处理、输入准备等环节,还介绍了Map任务上下文的创建,以及输入格式初始化和Mapper类运行过程,最后结束map阶段并关闭输入输出。

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

大数据

MapTask-input源码分析

MapTask

​ *run

​ *sout --排序

runNewMapper

​ (input)

​ *输入格式化类inputFormat 是反射出来的(自写的Map名称)

​ *切片 将原有的序列化的切片信息转化成对象

​ *准备输入-- input-- new NewTrackingRecordReader<切片对象,输入格式化对象,xx3,xx4>

​ *this.real = inputFormat.createRecordReader(记录读取器)

​ *createRecordReader 读取父类TextInputFormat

​ return new LineRecordReader --行为单位的记录读取器

​ *getCurrentKey() --被Mapper类的run方法调用,使用real(LineRecordReader)

​ *getCurrentValue()

​ *nextKeyValue()

​ *MapContextImpl Map任务自己的上下文(new)<job,input,output,split,…>

​ input–>reader context上下文的reader

​ 附上:reader–调用nextKeyValue()–>NewTrackingRecordReader–>real的nextKeyValue()

​ *try touch块 --真正执行

input 输入格式初始化 initialize 进入NewTrackingRecordReader类

​ 调用的是real.initialize,实质上是LineRecordReader 进入类

​ *nextKeyValue 初始化方法 切片的3个信息:切片的起始偏移量,切片结束的偏移量,切片的路径。

​ *fileIn的seek偏移:每一个map将数据流seek到自己的偏移量,读自己的数据。将fileIn包装

​ if(star !=0){start += in.readLine(new Text(),0,maxBytesToConsume(start))};

​ --除了第一个切片以外,每个切片都往下读取一行数据,保证数据的完整性

​ *getCurrentKey()

​ *getCurrentValue()

​ *nextKeyValue()

调用Mapper类的run

​ *nextKeyValue 进入 LineRecordReader 的 nextKeyValue方法

​ 默认<k,v>的 k 是行的偏移量,所以默认类型是LongWriteable

​ 读取时除第一个切片以外,读的是原有规划切片的第二行,第一行已经“让”出了

​ 结束map阶段

​ 关闭input,并制空

​ 关闭输出output(刷新)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值