Spark提交流程源码领读
从上图一步步来解析
-
通过SparkSubmit的脚本使用submit触发 doSubmit(arg[])
-
然后自己调用submit(args: SparkSubmitArguments, uninitLog: Boolean),
-
prepareSubmitEnvironment 它主要是使用从前两步解析的参数,选择对应的启动类,启动类不一定是我们写的主类。准备一些后面需要用到参数childArgs,childClasspath,sparkConf
比如yarn模式下是这个类org.apache.spark.deploy.yarn.YarnClusterApplication
-
自己调用runMain(childArgs: Seq[String],childClasspath: Seq[String],sparkConf: SparkConf,childMainClass: String,
verbose: Boolean),判断一下需要启动的类是不是SparkApplication的子类,如果不是使用JavaMainApplication包装一下,然后启动
-
然后会走到YarnClusterApplication的start方法中
-
接下来触发Client的提交应用的方法submitApplication,这里就是做关于申请资源,创建container,上下文等工作然后最终提交应用。
submitApplication方法的具体内容
-
createApplication 其实主要是去获得一个AppId然后包装为ApplicationSubmissionContext。它包含了启动AppMaster所需要的所有东西,RM会返回一个GetNewApplicationResponse,它包含了计算资源。比如,内存,cpu core等
详见这个类了解获取appId:GetNewApplicationRequest
-
verifyClusterResources 验证资源是否足够,这里主要就是验证了一下内存,并没有详细的验证
-
createContainerLaunchContext 根据GetNewApplicationResponse创建container,它包含启动AppMaster的命令和一些资源,还有安全验证的Token等
-
createApplicationSubmissionContext 使用Container创建一个应用上下文,主要是启动AppMaster的资源,应用的名字或者类型等一些公共参数
-
yarnClient.submitApplication(appContext)
通过包装请求SubmitApplicationRequest放松个RM,启动AppMaster
大概是入了个门吧,AppMaster是怎么启动driver,excutor后面再补充。