Yarn-cluster VS Yarn-client
從廣義上講,yarn-cluster適用於生產環境;而yarn-client適用於交互和調試,也就是希望快速地看到application的輸出。
從深層次的含義講,yarn-cluster和yarn-client模式的區別其實就是Application Master進程的區別,yarn-cluster模式下,driver運行在AM(Application Master)中,它負責向YARN申請資源,並監督作業的運行狀況。當用戶提交了作業之后,就可以關掉Client,作業會繼續在YARN上運行。然而yarn-cluster模式不適合運行交互類型的作業。而yarn-client模式下,Application Master僅僅向YARN請求executor,client會和請求的container通信來調度他們工作,也就是說Client不能離開。
Yarn-cluster:
Spark Driver首先作為一個ApplicationMaster在YARN集群中啟動,客戶端提交給ResourceManager的每一個job都會在集群的worker節點上分配一個唯一的ApplicationMaster,由該ApplicationMaster管理全生命周期的應用。因為Driver程序在YARN中運行,所以事先不用啟動Spark Master/Client,應用的運行結果不能在客戶端顯示(可以在history server中查看),所以最好將結果保存在HDFS而非stdout輸出,客戶端的終端顯示的是作為YARN的job的簡單運行狀況。
步驟如下:
這期間包括四個步驟:
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指定。
在yarn-client模式下,Driver運行在Client上,通過ApplicationMaster向RM獲取資源。本地Driver負責與所有的executor container進行交互,並將最后的結果匯總。結束掉終端,相當於kill掉這個spark應用。一般來說, 如果運行的結果僅僅返回到terminal上時需要配置這個。


配置YARN-Client模式同樣需要HADOOP_CONF_DIR/YARN_CONF_DIR和SPARK_JAR變量。