Spark 支持 Yarn 集群的部署模式,在 Spark On Yarn 模式下,每個 Spark 的 Executor 作為一個 Yarn container 在運行,同事支持多個任務(wù)在同一個 container 中運行。
Yarn 的 Application Master 概念:在 Yarn 中,每個 application 都有一個 Application 都有一個 Application Master 進程,它是 Application 啟動的第一個容器,負責從 ResourceManager 中申請資源,分配資源,同時通知 NodeManager 來為 Application 啟動 Container。
Spark On Yarn 有兩種模式,一種是 Yarn-client 模式,一種是 Yarn-cluster 模式。一般情況下,Yarn-client 模式使用在調(diào)試模式下,Yarn-cluster 模式使用在生產(chǎn)環(huán)境中。
1,Yarn-cluster 模式
在 Yarn-cluster 模式下,driver 運行在 Appliaction Master 上,Appliaction Master 進程同時負責驅(qū)動 Application 和從 Yarn 中申請資源,該進程運行在 Yarn container 內(nèi),所以啟動 Application Master 的 client 可以立即關(guān)閉而不必持續(xù)到 Application 的生命周期,下圖是 Yarn-cluster 模式:

在 Yarn-cluster 模式中,當用戶向 Yarn 中提交一個應用程序后,Yarn 將分兩個階段運行該應用程序:
- 第一個階段是把 Spark 的 driver 作為一個 ApplicationMaster 在 Yarn 集群中先啟動;
- 第二個階段是由 ApplicationMaster 創(chuàng)建應用程序,然后為它向 ResourceManager 申請資源,并啟動 Executor 來運行 Task,同時監(jiān)控它的整個運行過程,直到運行完成。
應用的運行結(jié)果不能在客戶端顯示(可以在 history server 中查看),所以最好將結(jié)果保存在 HDFS 而非 stdout 輸出,客戶端的終端顯示的是作為 Yarn 的 job 的簡單運行狀況。
2,Yarn-client 模式
在 Yarn-client 中,driver 運行在 client 上,通過 ApplicationMaster 向 RM 獲取資源。本地 driver 負責與所有的 executor container 進行交互,并將最后的結(jié)果匯總。結(jié)束掉終端,相當于 kill 掉這個 Spark 應用。因為 driver 在客戶端,所以可以通過 webUI 訪問 driver 的狀態(tài),默認是 http://hadoop1:4040 訪問,而 Yarn 通過 http:// hadoop1:8088 訪問。工作流程如下圖:

具體的執(zhí)行流程如下圖所示:

對比兩種模式可以看出一點,Yarn-client 模式下的 driver 進程執(zhí)行在本地機器上,而 Yarn-cluster 模式下的 driver 進程執(zhí)行在 Yarn 集群上面。