bin/spark-submit
--class org.apache.spark.examples.SparkPi
--master yarn
./examples/jars/spark-examples_2.12-3.3.1.jar 10
這一句命令實際上是 啟動一個Java程序 java?org.apache.spark.deploy.SparkSubmit
并將命令行參數解析到這個類的對應屬性上
因為master給的是yarn,所以會通過反射創建一個yarn的client客戶端,連接上yarn
yarnClient會通過submitApplication向yarn提交用戶的應用程序以及讓yarn準備用戶應用執行的環境=> yarnClient會將java ApplicationMaster傳給yarn的RM,讓yarn的RM在某一個NM上啟動一個容器執行java ApplicationMaster,執行之后就會在當前NM節點啟動一個ApplicationMaster進程
如果是集群模式,ApplicationMaster就會執行runDriver方法啟動一個Driver線程通過反射執行用戶應用程序的main方法(比如org.apache.spark.examples.SparkPi)
除了啟動Driver線程之外,ApplicationMaster會調用registerAM方法創建AMRMClient用來實現AM和RM的交互,AM會通過AMRMClient向RM反饋用戶程序的main方法已經開始執行并向RM申請Container,AM獲取到Container后會遍歷這些Container,在遍歷的過程中會生成一個NMClient用來和Container交互,NMClient會向Container發送java Executor生成一個ExecutorBackend進程(Executor),這個Executor進程(類)內部有一個executor屬性(也是一個類),這個executor屬性才是真正用來計算的,而Executor進程是用來和ApplicationMaster這個進程交互的(實際是和AMMaster的Driver線程通信)。
excutor屬性中有一個線程池,用來并行執行多個TASK