1. 程式人生 > >spark在yarn上面的執行模型:yarn-cluster和yarn-client兩種執行模式:

spark在yarn上面的執行模型:yarn-cluster和yarn-client兩種執行模式:



Spark在YARN中有yarn-cluster和yarn-client兩種執行模式:
I. Yarn Cluster
Spark Driver首先作為一個ApplicationMaster在YARN叢集中啟動,客戶端提交給ResourceManager的每一個job都會在叢集的worker節點上分配一個唯一的ApplicationMaster,由該ApplicationMaster管理全生命週期的應用。因為Driver程式在YARN中執行,所以事先不用啟動Spark Master/Client,應用的執行結果不能在客戶端顯示(可以在history server中檢視),所以最好將結果儲存在HDFS而非stdout輸出,客戶端的終端顯示的是作為YARN的job的簡單執行狀況

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啟動Spark App Master,並向ResourceManager AsM註冊
4. Spark ApplicationMaster從HDFS中找到jar檔案,啟動DAGscheduler和YARN Cluster Scheduler
5. ResourceManager向ResourceManager AsM註冊申請container資源(INFO YarnClientImpl: Submitted application)
6. ResourceManager通知NodeManager分配Container,這時可以收到來自ASM關於container的報告。(每個container的對應一個executor)
7. Spark ApplicationMaster直接和container(executor)進行互動,完成這個分散式任務。
需要注意的是:
a). Spark中的localdir會被yarn.nodemanager.local-dirs替換
b). 允許失敗的節點數(spark.yarn.max.worker.failures)為executor數量的兩倍數量,最小為3.
c). SPARK_YARN_USER_ENV傳遞給spark程序的環境變數
d). 傳遞給app的引數應該通過–args指定。

II. yarn-client
(YarnClientClusterScheduler)檢視對應類的檔案
在yarn-client模式下,Driver執行在Client上,通過ApplicationMaster向RM獲取資源。本地Driver負責與所有的executor container進行互動,並將最後的結果彙總。結束掉終端,相當於kill掉這個spark應用。一般來說,如果執行的結果僅僅返回到terminal上時需要配置這個。

客戶端的Driver將應用提交給Yarn後,Yarn會先後啟動ApplicationMaster和executor,另外ApplicationMaster和executor都 是裝載在container裡執行,container預設的記憶體是1G,ApplicationMaster分配的記憶體是driver- memory,executor分配的記憶體是executor-memory。同時,因為Driver在客戶端,所以程式的執行結果可以在客戶端顯 示,Driver以程序名為SparkSubmit的形式存在。
配置YARN-Client模式同樣需要HADOOP_CONF_DIR/YARN_CONF_DIR和SPARK_JAR變數。
提交任務測試: