1. 程式人生 > >Spark2.x原始碼分析---spark-submit提交流程

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核心架構設計與實現原理