一 前言
在mapreduce中,对于一个job,它的提交流程,我们有必要去研究一下,当然,在这里只是研究它的一个大体流程,并不会精确到每一句代码 😄
二 流程
1.调用Job对象的waitForCompletion(boolean verbose)方法,这个方法有一个boolean类型的参数,用来决定是否将运行进度信息输出给用户。(注:当然也可以直接调用submit()方法)😊
2.如果直接调用waitForCompletion(boolean verbose),进入方法内部:有submit()方法 ,有用于打印Job过程信息的代码🤭
3.进入到submit()方法内部,connect()方法用于建立连接,获得cluster对象之后,通过cluster获得一个submitter提交对象🤭
4.进入到connect()方法内部,如果是本地提交job,那么cluster为空,需要创建一个cluster对象,在创建cluster对象的时候初始化了信息,包括所使用的文件系统以及job是被提交到本地电脑上(mr程序运行在本地模拟器-LocalJobRunner)还是yarn集群(YarnRunner)上去运行等信息。
这里面的conf,放的就是${HADOOP_HOME}/etc/hadoop里面的配置文件
5.进入initialize方法,会根据运行环境创建客户端协议,创建本地运行或是集群运行客户端对象,此处会根据mapreduce.framework.name的配置选择使用哪个创建相应的客户端,是本地作业,还是yarn作业。
6.进入submitJobInternal方法,提交job
checkSpecs用来判断输出目录的合法性,这就是为什么每次提交作业,总是这个错误比较靠前的先报出来
创建提交资源的路径:本地文件系统上 还是 HDFS文件系统上 (要看是yarn运行还是本地运行)
设置job Id和作业提交目录
拷贝本地文件到hdfs上(如果有使用hdfs集群的话)
![]()
创建切片信息
job运行需要的配置信息写到stage中
提交job,返回提交状态