MapReduce作业提交源码分析第一讲【小二讲堂】
本片博文主要讲述MapReduce作业提交源码的分析流程,流程图都是小二手把手操作出来的,建议新手看之前连接hadoop 2.x基本架构和hdfs架构原理解析。
进入小二课堂进行全面学习:小二课堂请点击进入
或者直接进入hdfs底层原理解析及架构分析:https://blog.csdn.net/Mirror_w/article/details/89288212
或者了解hadoop 2.x hadoop3.x运行原理:https://blog.csdn.net/Mirror_w/article/details/89300798
1.客户端调用waitforcompletion()方法
进入到job.class类
2,waitforcompletion内部进行调用两个方法,submit和monitorandprintjob(),如下图所示,第一的是用于提交作业的方法,第二个方法是用于客户端打印作业执行清空的方法 。
3 .setUserNewAPI()提交最新的API用于作业流程的执行。
connect()连接服务端
getJobSubmitter()通过参数获取submitter作业提交者。
submitter.submitJobInternal()通过客户端提交的job作业和集群对象进行提交作业
进入JobSubmitter.class类
4.
checkSpecs(job)检查作业的输出路径是否设置
获取数据切片,调用了方法writeSplits()
5.进入writeSplits()方法里
对API进行判断是旧的api还是新的,,当然是新的了
6.进入writeNewSplit方法
首先通过配置文件的信息获取输入格式化类的对象,这个输入格式化类的对象,如果在配置文件中设置了,则是用户设置的格式化类的对象,没有设置则是默认的TextInputFormat类的对象。输入格式化类的JobContextImpl这个类来进行返回的。
7.进入获取切片的方法getSplits(
进入FIleInputFormat类 --getSplits()方法
a.minsize参数
首先获取minsize参数:
如果用户设置了则是用户设置的数,没有设置则是1,此时没有设置则返回1,即minsize=1;
b.maxsize参数
如果split_maxsize这个参数没有设置则返回Long的最大值,这里没有设置则返回对应的long最大值
c.分析下面方法
liststatus(job)方法通过该job路径返回路径下的所有文件信息。
blklocations=getBlocklocations();获取对应文件的位置信息。
getFileSystem()获取文件系统
blocksize=文件大小。
获取切片大小的方法:
splitSize=computeSplitSize(blockSize,minSize,maxSize);
进入方法内:
通过数学方法计算返回切片的值:返回blocksize,block块的大小(默认128M)
c.1继续分析
获取block块的索引blkindex=getBlockIndex(block块的位置索引,文件长度-文件长度(第一次))初始索引为0
开始为0,第一次:bytesRemaning=开始总的数据块大小-第一次切片的大小,第二次的索引位置则是128,有上面代码可知,获取到的索引就是:0、128、256(128+128)+384(256+128)…直至数据完毕。也就是偏移量吧。
c.2getBlockIndex方法
进行判断,上面方法是判断后去的offset偏移量是在那个block块上,是否在block块的范围之内。
c.3 splits切片数组信息
在splist封装了文件的信息,如斜土例子
文件 offset偏移量 数组存储的位置信息
类似:test.txt 1048576 node01
test.txt 1048576 node02 node04
将切片的数量进行分装。这里意味着数据已经封装好了。
数据切片获取到之后,在jobSubmitter.class类中
在这里完成了maps的数据切片的封装。
7.数据封装完毕,开始提交作业。
jps 在作业提交中的主要进程有:
YarnChild也就是运行作业的容器(Container)。
MRAppMaster:作业执行者和作业调度者
Runjar:客户端进程,这里可以理解为就是客户端
以上博文若有不解之处,请下方评论席回复,小二速回!!!