input位置_MapReduce源码二次解析(MapTask--Input实现原理)

1.在Hadoop的jar包中的mapred包中找到MapTask和ReduceTask两个类

679cc4e36221b07743c739eae4638613.png

在Mapper类中的context对象包含了map的输入和输出

46c2b8d6dc9348775fe38e109df45b60.png

在MapTask中是没有主方法的,它是通过容器container反射成为一个对象,它来执行run方法,如下所示:

如果Reduce数量设定,则map端执行排序,没有设定reduce数量,则map端不排序

//在主函数WordCount类中设置Reducer任务数
job.setNumReduceTasks(2);

MapTask的run方法:

b8fb6b4808bf45aebea084b18020eb92.png

查看runNewMapper方法:

2b8d9a6f7bcba399fed4bb802354d6b7.png

查看runNewMapper方法:

宏观上MapTask的主要任务:

1.输入初始化

2.调用Mapper类的run方法,也就是在这里实现了MapTask与用户的交互,框架最终调用的是Mapper的run方法。

3.读取完毕关闭input对象,并置为null,防止本次数据写到下次调用中

4.输出完毕关闭output对象,并置为null,防止本次数据写到下次调用中

099154e7f59fc7a45e81393304aadb51.png

MapTask运行起来之后,MapTask会去HDFS集群中,把Jar包,配置信息,切片信息拉取到本地的,

所以这里的jb信息和客户端书写的个性化配置信息是相同的。

这里taskContext.getMapperClass(),隐性的就是调用job.getMapperClass(),也就是配置信息去取mapClass

根据用户在配置文件中指定的类,反射我们手写的具体map类

66d5b13e86c31c718a8684916d106c4c.png

d01a49d4340b2e6a73dbd178d484956f.png

定义input,用于从HDFS中读取切片信息,在定义的记录读取器中,传入了创建的split对象和输入格式化对象

417a83213dd1d24b56811b2c2ff7f227.png

进入NewTrackinngRecordReader对象,我们传入的输入格式化对象,创建了RecordReader对象,并赋值给real

客户端输入格式化inputFormat计算切片,map阶段,输入格式化(inputFormat)会给我们的输入对象创建一个记录读取器(RecordReader)。

726bb8e42c955c762b40684f6af5fed0.png

在map中inputFormat创建了一个行读取器LineRecordReader来读取行数

afdda65ad1a769b55c528371f5a61acb.png

由此可知,框架默认按行读取

cd6f3f0bebd11aa63487a67033c33d0c.png

进入LineRecordReader方法:

这里有Mapper类中的各种方法,也就是最终是LineRecordReader去执行读取任务

1756907368985c11529ec1dea3c08799.png

Mapper类:

f35987fdc2781375bb03faa8df89975d.png

至此构造完了Input对象

ccab911fd53afc93d52ddda6628f6296.png

构建Map自己的上下文对象

MapContext上下文{包含nextKeyValue,getCurrentKey,getcurrentValue}

调用NewTrackingRecordReader{包含nextKey,ValuegetCurrentKey,getcurrentValue}

调用LineRecordReader{包含nextKeyValue,getCurrentKey,getcurrentValue}

在Map自己的上下文对象中,调用的是NewTrackingRecordReader中的方法

d23e1b3173c860e142d7f891508df629.png

进入MapContextImpl的实现,它包含了Mapper类中要使用的三个方法,Mapper类调用NewTrackingRecordReader:

4e3987f76d15efdf50c520308278d857.png

NewTrackingRecordReader调用LineRecordReader中的方法

238dcd9e9ae157ffbad40a6c88420d06.png

上述构造完成之后进行各项初始化操作,input就是NewTrackingRecordReader对象,它依旧会去调用LineRecordReader对象,执行初始化。

4abfeefc2071b511d0721a580514f529.png

由LineRecordReader对象real执行初始化:

e6b66ab7e6fcd2c399bd7cf66d98d590.png

来看LineRecordReader具体业务逻辑实现:

从切片中获取起始偏移量,起始偏移量加上切片长度就是结束偏移量,根据切片获取文件路径

根据配置文件job获取文件系统对象,然后打开文件进行读取,这个流open是FSDataInputStream输入流

4cf5046f8c08ebd1c031c6d53c26715f.png

因为是分布式文件系统,多个map一起读取数据,传入‘start’每个map根据自己的起始位置去读取数据

39c481a0900836140f94f350e0cf8b2c.png

重点 :除了第一个切片,后续的所有切片都不读取第一行数据

e91422faa7fa284b84442e352945c0a1.png

至此map端完成初始化工作。

map在输入初始化过程中做的事情:

map的输入来自于hdfs,所以它准备了一个对hdfs一个切片对应的流,开启一个输入流,然后将偏移量seek到自己的切片位置,这时候这个流就可以读取自己的切片位置了,但是它先把各自的第一行读一下(所以New Text()是匿名的),然后算出字节数,加到自己的切片的起始位置上,这样就向下移动了一行,为的是在初始化准备的时候,将切片的偏移量向下移动一行,因为hdfs做块的切割的时候,有可能将数据切割成上下两个块的尾和头,那么就需要将下一个块的“头”,还给上一个块来处理。如果前后两个block在同一台机器上,那么直接本地读取,否则跨网拉取数据。规避数据不完整的问题。

处理过程:nextKeyValue

只要Mapper端的run方法调用起来,此处对key和value进行赋值操作

27ad807a735e3beb657c1b5f07333a57.png

map端在input过程中主要做了两件事情,初始化(I/O流读取过程中:seek偏移量、切片第一行的让出)和nextKeyValue(对key,value赋值与更新)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生就业服务平台管理系统按照操作主体分为管理员和用户。管理员的功能包括学生档案管理、字典管理、试卷管理、试卷选题管理、试题表管理、考试记录表管理、答题详情表管理、错题表管理、法律法规管理、法律法规收藏管理、法律法规留言管理、就业分析管理、论坛管理、企业管理、简历管理、老师管理、简历投递管理、新闻资讯管理、新闻资讯收藏管理、新闻资讯留言管理、学生信息管理、宣传管理、学生管理、职位招聘管理、职位收藏管理、招聘咨询管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 大学生就业服务平台管理系统可以提高大学生就业服务平台信息管理问题的解决效率,优化大学生就业服务平台信息处理流程,保证大学生就业服务平台信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理新闻信息,管理大学生就业服务平台信息,包括考试管理,培训管理,投递管理,薪资管理等,可以管理新闻信息。 考试管理界面,管理员在考试管理界面中可以对界面中显示,可以对考试信息的考试状态进行查看,可以添加新的考试信息等。投递管理界面,管理员在投递管理界面中查看投递种类信息,投递描述信息,新增投递信息等。新闻信息管理界面,管理员在新闻信息管理界面中新增新闻信息,可以删除新闻信息。新闻信息类型管理界面,管理员在新闻信息类型管理界面查看新闻信息的工作状态,可以对新闻信息的数据进行导出,可以添加新新闻信息的信息,可以编辑新闻信息信息,删除新闻信息信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值