java SparkSubmit -xxx -xxx -xxx
提交語句會在client上開啓一個提交的進程
此處只是spark在yarn cluster模式下主要的提交流程框架,主要過程如下:
1、通過啓動SparkSubmit進程,內部反射運行Client類的main方法;
2、client主要是根yarn集羣的rm進行交互,主要是向rm傳送啓動am進程的啓動命令以及參數,在yarn的nm節點上啓動ApplicationMaster;
3、ApplicationMaster進程啓動之後反射啓動用戶提交的spark程序,也就是driver,注意這裏是通過單獨開一個線程來反射啓動的;
ApplicationMaster還有一個重要的事情就是跟yarn的rm進行通信交互,向yarn主次並且獲取資源,之後分配資源,分配資源考慮節點數據以及算法的優化,
之後通過線程池向分配的container發送啓動executorBackend的進程啓動command來啓動CoarseGrainedExecutorBackend進程;
4、CoarseGrainedExecutorBackend進程main方法做的事情主要是跟driver通信,向driver註冊之後進行一系列通信,啓動executor並且根據通信狀態執行具體的task;
5、task分配涉及到後續的driver的任務分解,stage確定,以及分區task分配的工作了。
JVM -Process (SparkSubmit) main方法
1 SparkSubmit
//啓動進程
--main
//封裝進程啓動的xxx參數
--new SparkSubmitArguments
//提交
--submit
//準備提交環境(返回的是自己spark程序的mainClass以及args等信息)
--prepareSubmitEnvironment
//cluster提交模式
--childMainClass = "org.apache.spark.deploy.yarn.Client"
//client提交模式
--childMainClass = args.mainClass(自己打包spark程序的主類)
//參數就是prepareSubmitEnvironment返回的結果
--doRunMain (runMain)
//反射加載類
--Utils.classForName(childMainClass)
//查找main方法
--mainClass.getMethod("main",new Array[String](0).getClass)
//調用main方法
--mainMethod.invoke
2 Client
--main
--new ClientArguments(argsString)
--new Client
//連接yarn的客戶端,內部參數是yarn集羣resourceManager的address等信息
--yarnClient = YarnClient.createYarnClient
--client.run()
//產生applicationId
--submitApplication
//封裝指令 command = /bin/java org.apache.spark.deploy.yarn.ApplicationMaster
--createContainerLaunchContext
--createApplicationSubmissionContext
//向yarn提交應用
--yarnClient.submitApplication(appcontext)
3 ApplicationMaster(yarnNM中啓動)
//啓動進程
--main
--new ApplicationMasterArguments(args)
//創建應用管理器對象
--new ApplicationMaster
--master.run()
//Cluster
--runDriver
//啓動用戶應用
--startUserApplication
//獲取用戶類的main方法
--userClassLoader.loadClass(args.userClass).getMethod("main", classOf[Array[String]])
//啓動線程,執行用戶類的main方法,線程的名字就是driver!!!
--new Thread().start()
//註冊AM
--registerAM
//獲取yarn資源
--client.register
//分配資源
--allocator.allocateResources()
//考慮數據文件節點的本地化
--handleAllocatedContainers
//啓動cachedThreadPool運行
--runAllocatedContainers
--new ExecutorRunnable().run()
//rpc跟nm發送啓動進程的指令, command = /bin/java org.apache.spark.executor.CoarseGrainedExecutorBackend
--startContainer
4 CoarseGrainedExecutorBackend
--main
--run
--onStart
//ref爲CoarseGrainedExecutorBackend類中的Driver的rpc通信的句柄
--ref.ask[Boolean](RegisterExecutor)
--receive
//rpc通信模式匹配executor後臺的操作
--case RegisteredExecutor
--new Executor
--case launchTask
--executor.launchTask