有兩種模式:cluster 和 driver
區別:
cluster 模式:Driver 程序在 YARN 中運行,應用的運行結果不能在客戶端顯示,所以最好運行那些將結果最終保存在外部存儲介質(如 HDFS、Redis、Mysql)而非 stdout 輸出的應用程序,客戶端的終端顯示的僅是作為 YARN 的 job的簡單運行狀況。
client 模式:Driver 運行在 Client 上,應用程序運行結果會在客戶端顯示,所有適合運行結果有輸出的應用程序(如
spark-shell)
Cluster 模式流程:
Spark Driver 首先作為一個 ApplicationMaster 在 YARN 集群中啟動,客戶端提交給 ResourceManager 的每一個 job 都會在集群的 NodeManager 節點上分配一個唯一的 ApplicationMaster,由該 ApplicationMaster 管理全生命周期的應用。
具體過程:
1. 由 client 向 ResourceManager 提交請求,並上傳 jar 到 HDFS 上
這期間包括四個步驟:
a).連接到 RM
b).從 RM 的 ASM(ApplicationsManager )中獲得 metric、queue 和 resource 等信息。
c). upload app jar and spark-assembly jar
d).設置運行環境和 container 上下文(launch-container.sh 等腳本)
2. ResouceManager 向 NodeManager 申 請 資 源 , 創 建 Spark ApplicationMaster ( 每 個 SparkContext 都 有 一 個ApplicationMaster)
3. NodeManager 啟動 ApplicationMaster,並向 ResourceManager AsM 注冊
4. ApplicationMaster 從 HDFS 中找到 jar 文件,啟動 SparkContext、DAGscheduler 和 YARN Cluster Scheduler
5. ResourceManager 向 ResourceManager AsM 注冊申請 container 資源
6. ResourceManager 通知 NodeManager 分配 Container,這時可以收到來自 ASM 關於 container 的報告。(每個 container對應一個 executor)
7. Spark ApplicationMaster 直接和 container(executor)進行交互,完成這個分布式任務。
如果使用 spark on yarn 提交任務,一般情況,都使用 cluster 模式,該模式,Driver 運行在集群中,其實就是運行在ApplicattionMaster 這個進程成,如果該進程出現問題,yarn 會重啟 ApplicattionMaster(Driver),SparkSubmit 的功能就是為了提交任務。