本文以spark on yarn的yarn-cluster模式进行源码解析,如有不妥之处,欢迎吐槽。
步骤1.spark-submit提交任务脚本
spark-submit
--class 主类路径 \
--master yarn \
--deploy-mode cluster \
--driver-memory 申请driver内存 \
--executor-memory 申请每个executor内存 \
--executor-cores 申请每个executor核数 \
jar包路径 \
相关参数
步骤2.任务提交后spark会调用org.apache.spark.deploy.SparkSubmit的main方法,通过提交脚本的参数进行模式匹配,判断提交操作类型。
appArgs.action match {
case SparkSubmitAction.SUBMIT => submit(appArgs)
case SparkSubmitAction.KILL => kill(appArgs)
case SparkSubmitAction.REQUEST_STATUS => requestStatus(appArgs)
}
经过匹配后得出当前为SparkSubmitAction.SUBMIT,则调用submit方法。
步骤3.submit方法首先会调用prepareSubmitEnvironment对脚本参数进行处理,然后返回元组。
val (childArgs, childClasspath, sysProps, childMainClass) = prepareSubmitEnvironment(args)
prepareSubmitEnvironment方法的一个重要作用就是指明后续要执行的类的类路径。
if (isYarnCluster) {
childMainClass = "org.apache.spark.deploy.yarn.Client"
submit调用doRunMain中的runMain方法,runMain方法会根据childMainClass获取org.apache.spark.deploy.yarn.Client的类对象mainClass。
注:org.apache.spark.deploy.yarn.Client为用户自定义类的包装。
mainClass = Utils.classForName(childMainClass)
然后通过类对象获取org.apache.spark.deploy.yarn.Client的主方法main。
val mainMethod = mainClass.getMethod("main", new Array[String](0).getClass)
最后通过反射机制调用org.apache.spark.deploy.yarn.Client的main方法。
mainMethod.invoke(null, childArgs.toArray)
步骤4.调用org.apache.spark.deploy.yarn.Client的入口方法main,其中最重要的是创建了Client的实例并且调用了run方法。
new Client(args, sparkConf).run()
而在run方法中最重要的是调用了提交Application方法。
this.appId = submitApplication()
步骤5.submitApplication()方法非常非常非常重要!
(1)初始化并开启了一个非常非常重要的对象!yarnClient!
yarnClient.init(yarnConf)
yarnClient.start()
(2)yarnClient为ResourceManager申请了新的Application
val newApp = yarnClient.createApplication()
(3)判断集群是否有足够的资源启动ApplicationMaster(资源判断逻辑解析后续深入解析)
verifyClusterResources(newAppResponse)
(4)为ApplicationMaster申请资源空间(container)和app的运行空间(上下文)
val containerContext = createContainerLaunchContext(newAppResponse)
val appContext = createApplicationSubmissionContext(newApp, containerContext)
(5)向ResourceManager最终注册Application
yarnClient.submitApplication(appContext)
参考文档:
1.spark提交应用的全流程分析https://blog.csdn.net/jediael_lu/article/details/76735217
2.Spark技术内幕++深入解析Spark内核架构设计与实现原理