Spark2.x原始碼分析---spark-submit提交流程
本文以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)
參考文件:
2.Spark技術內幕++深入解析Spark核心架構設計與實現原理