hadoop yarn的job提交流程源码分析

yarn是hadoop 2.x 版本引进的作业调度框架,由NodeManager和ResourceManager组成。可以进行作业的提交和管理。现在通过一个简单的作业提交进行源码分析。

1、job提交流程图:

2、job提交源码流程:

3、源代码分析:

  • job.waitForCompletion(true):

    这个是作业提交的入口,返回了作业是否完成的状态 。可以看出主要是调用了submit()方法进行提交。然后根据verbose参数决定是否打印作业的运行信息到控制台

  • submit():

    可以看到submit()方法又调用了connect()方法

  • connect():

    在connect()方法中,主要是为成员变量cluster(集群,负责通信)进行复制

  • new Cluster(getConfiguration())

    随后进入cluster的构造方法。可以看出此方法中对conf\用户信息ugi等成员变量赋值,随后就调用了initialize()方法

  • initialize():

    此方法中通过遍历各种clientprotocolprovider,进行对provider的赋值。最终赋值是通过provider.create(conf);根据配置文件中所配置的提交器是本地提交local还是yarn 。再此方法中也对client进行了赋值,可以通过此成员进行RPC通信

  • getJobSubmitter(cluster.getFileSystem(), cluster.getClient())
    connect方法完成之后,cluster也赋好了值,此时调用getJobSubmitter对提交器赋值,于是此提交器也拥有了与远程rpcserver通信的能力

  • submitter.submitJobInternal(Job.this, cluster)




    这是最主要的方法,首先通过checkSpecs()方法检查输出目录是否存在 ,addMRFrameworkToDistributedCache方法将配置文件放入分布式缓存中,JobSubmissionFiles.getStagingDir(cluster, conf)方法获取到提交资源的路径,通过cluster与resourceManager进行通信(cluster通过成员变量client与远程通讯,jobid也是同理获得。copyAndConfigureFiles()方法就是将配置文件与jar包拷贝到前面获取到的提交资源路径,writeSplits方法则是获取切片,从而决定map的个数

  • copyAndConfigureFiles()


    short型变量replication是可以通过配置文件配置的副本数,往hdfs写文件时指定副本数可以方便集群上的节点获取资源(默认10个副本) 。写文件时,首先从配置文件中获取到files、libjars、archives、jobJar


随后进行目录检查的创建


这里调用copyjar()进行Jar包的复制,里面调用了hdfs的客户端命令(copyfromlocal)

  • writeSplits

    将切片的规划信息写入到资源提交文件


通过反射机制获取到inputformat类实例,如果没有配置,默认为TextInputFormat,然后通过这个类的getSplits方法(实际是FileInputFormat去实现)获得切片信息



首先获得切片最小值,getFormatMinSplitSize()返回1, getMinSplitSize(job)通过配置文件读取切片最小值,如果没配置,默认为1
,切片最大值由getMaxSplitSize方法通过配置文件决,如果没配置默认返回Long的最大值。通过listStatus方法获取job需要处理的文件目录。因为切片跟文件大小有关,遍历文件。首先获取到文件的block大小(配置文件配置,128M或64M)和Block所在位置。随后判断文件是否能被切片(压缩文件不能只读取一部分,因此不能切片),如果可以切片,通过 computeSplitSize(blockSize, minSize, maxSize)方法进行切片大小计算

切片大小取得是maxsize与blocksize中较小的值,再取这个值和minSize中较大的值。就是最终切片的大小
有了切片大小之后就通过偏移量进行切片的规划的计算

猜你喜欢

转载自blog.csdn.net/phn_csdn/article/details/73277038
今日推荐