大数据
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(刷新)