1. 程式人生 > >Spark下Yarn-Cluster和Yarn-Client的區別

Spark下Yarn-Cluster和Yarn-Client的區別

0 首先注意的概念

ResourceManager:是叢集所有應用程式的資源管理器,能夠管理叢集的計算資源併為每個Application分配,它是一個純粹的排程器。
NodeManager:是每一臺slave機器的代理,執行應用程式,並監控應用程式的資源使用情況。
Application Master:每一個應用程式都會有一個Application Master,它的主要職責是向RM申請資源、在每個NodeManager上啟動executors、監控和跟蹤應用程式的程序等。

1 Yarn-Cluster

這裡寫圖片描述
執行過程:
(1)客戶端提交Application到RM,這個過程做的工作有判斷叢集資源是否滿足需求、讀取配置檔案、設定環境變數、設定Application名字等等;
(2)RM在某一臺NodeManager上啟動Application Master,AM所在的機器是YARN分配的,事先是不知道的;
(3)AM初始化SparkContext,開始驅動程式,這個NodeManager便是Driver;
(4)AM向ResourceManager申請資源,並在每臺NodeManager上啟動相應的executors;
(5)初始化後的SparkContext中的通訊模組可以通過AKKA與NodeManager上的容器進行通訊。
比以前的更多的理解:
(1)Application Master所在的NodeManager是Yarn隨機分配的,不是在主節點上,下圖是實驗室叢集上跑得一個Spark程式,tseg0是主節點,tseg1~tseg4是workers,IP10.103.240.29指的是tseg3:
這裡寫圖片描述


(2)在上圖還可以看出,executor的容器和AM容器是可以共存的,它們的封裝都是容器;
(3)AM是Yarn啟動的第一個容器;
(4)AM所在的NodeManager就是平常說的Driver端,因為這個AM啟動了SparkContext,之前實驗室說的“誰初始化的SparkContext誰就是Driver端”一直理解錯了,以為這句話是相對於機器說的,但其實是相對於Cluster和Client的叢集模式來說的(不知道其他模式Mesos、standalone是不是也是這樣)。
(5)在Application提交到RM上之後,Client就可以關閉了,叢集會繼續執行提交的程式,在實際使用時,有時候會看到這樣一種現象,關閉Client會導致程式終止,其實這個Application還沒有提交上去,關閉Client打斷了提交的過程,Application當然不會執行。

YARN-Client

這裡寫圖片描述
(1)Client Application會初始化SparkContext,這是Driver端;
(2)提交Application到RM;
(3)應該是在RM所在的機器上啟動AM(?不確定);
(4)AM向RM申請資源,並啟動NodeManager上的Executors;
(5)Executors與SparkContext初始化後的通訊模組保持通訊,因為是與Client端通訊,所以Client不能關閉。

YARN-Cluster和YARN-Client的區別

(1)SparkContext初始化不同,這也導致了Driver所在位置的不同,YarnCluster的Driver是在叢集的某一臺NM上,但是Yarn-Client就是在RM在機器上;
(2)而Driver會和Executors進行通訊,這也導致了Yarn_cluster在提交App之後可以關閉Client,而Yarn-Client不可以;
(3)最後再來說應用場景,Yarn-Cluster適合生產環境,Yarn-Client適合互動和除錯。

由此想到的Spark多使用者OnYarnCluster

之前實驗室配過Hadoop多使用者,最近因為培訓Spark,又得在這個基礎上再能夠執行Spark。做的工作很簡單,就是把Spark以及Spark依賴的環境scp過去,然後再改一下相應的配置就可以了。猜想的不同使用者執行Spark On Yarn Cluster如下圖所示,無非就是多增加了一個使用者Client,因為ResourceManager是唯一的,所以不同使用者CLient提交的Spark Application在叢集上執行都是一樣的。
這裡寫圖片描述

Reference

我可能是個坑

有些地方是自己的理解,可能會出錯。