Spark on YARN 筆記

一直對hadoop這套侷限在會用就好,沒有對hadoop生態有個系統性的深入瞭解,也就導致在用的時候出問題很難找到關鍵的原因,都得google so 各種找相關信息。所以現在覺得,還是得花一些時間,至少把與平時用到的相關部分的原理、概念理解清楚。

只要是用hadoop生態的組件,很多都會用YARN來管理資源與任務分配。而資源分配的合理與否,直接關係到任務的執行效率,甚至決定成功或失敗。spark又是現在主流的大數據計算框架,所以就把理解清楚yarn的架構以及spark與yarn的結合作爲學習的起始點吧。

YARN的架構

YARN是(Yet Another Resource Negotiator,另一種資源協調者)的縮寫。主要用來管理分佈式集羣的資源,理解YARN主要得理解4個抽象的組件。ResourceManager、ApplicationMaster、NodeManager與Container。

ResourceManager:可以理解爲整個分佈式集羣的主管,負責管理整個集羣的資源分配。

ApplicationMaster:一個集羣中可以運行有多個應用,可以是map reduce, 可以是spark應用等,只要是適用YARN做資源分配的每一個應用都會有一個ApplicationMaster,它負責向ResourceManager申請資源,以及與NodeManager協調執行具體的任務。

NodeManager:作爲ResourceManager的slave(worker),啓動container,管理資源以及向ResourceManager彙報資源使用情況。

Container:一個包含內存、CPU、網絡、磁盤,以後可能還有GPU資源的容器。每個容器圈定了物理機器上的一部分資源,再把它們分配給運行在容器裏的進程,每個容器可以運行多個進程,這些參數都是可配置的。所以也可以把容器看做一個實際執行計算任務的虛擬機。

下面這張圖清晰的反映了YARN的架構,以及各組件間是如何協調工作的。

YARN_Architect

這幅圖中有兩個client提交了各自的應用程序,紫色應用程序的ApplicationMaster運行在第一個節點上,棕色應用程序的ApplicationMaster則被分配在第二個節點上。它們都向ResourceManager申請資源,ResourceManager則爲紫色應用程序分配了一個位於第二個節點上的Container,爲棕色應用程序分配了位於第一個與第三個節點上共3個Container。Container與對應的ApplicationMaster通信匯報任務狀態,ApplicationMaster再與ResourceManager通信。NodeManager管理Container的啓動與回收,同時向ResourceManager彙報狀態。

Spark 架構

Spark_cluster

spark集羣的架構如上圖所示,driver program就是運行用戶邏輯代碼的程序,並維護spark運行時的context,以及處理與cluster manager的通信,請求資源來運行spark應用。

cluster manager顧名思義就是集羣管理員,管理整個集羣的資源分配。

worker node就是集羣的slave,它們是實際運行executor的物理機器。一個worker上可以啓動多個executor,每個executor有固定量可配置的資源,其實就是一個JVM。

spark會根據driver program中的邏輯代碼生成一個執行若干action與transformation操作的DAG,然後把DAG分解成若干stage,再分解成若干task。driver根據具體的task向cluster manager申請資源,cluster manager與worker node通信確定可用的閒置資源,然後把worker node的信息告訴driver。driver再將需要執行的操作以及對應的閉包(具體方法代碼)序列化後傳給worker node,然後worker node選擇合適的executor去執行這些task。

Spark on YARN

瞭解了YARN的架構以及spark集羣的架構之後,就可以瞭解spark在YARN上是如何運行的。

client mode

根據deployment mode的不同有兩種形式,一種是client一種是cluster, 先上圖, client mode的架構如下圖所示。

spark_yarn_client

在這裏Spark Driver的角色與spark架構中的Driver Program的角色是一致的,且Spark Driver運行在客戶端,它的資源使用與YARN沒有關係。YARN爲Spark起的Application Master與YARN ResourceManager共同扮演spark架構中的Cluster Manager的角色。AM向RM申請資源,RM將空閒節點的信息反饋給AM,AM再與NodeManager通信,讓NodeManager來啓動executor。spark的worker node在YARN中的對應是Container,假如YARN管理的集羣有3臺服務器,但是每臺服務器可以啓動很多Container,所以對應到spark的概念中就是這個spark集羣有很多worker node而不僅僅是3個。

cluster mode

cluster mode的架構如下圖所示
spark_yarn_cluster

其實不管client mode還是cluster mode,實際的job都是在集羣上執行的。唯一的區別就是driver program在集羣上還是在客戶端。從cluster mode的架構圖可以看出,Spark Driver與ApplicationMaster都是運行在YARN分配的容器中,這對於client不是集羣的機器,而是遠程機器是有好處的,可以減少很多數據傳輸的時間。並且client在提交完任務之後,stdout的信息是RUNNING的時候,斷開也不會影響任務的執行。

client mode還是cluster mode沒有絕對的好壞,看實際情況而定。對於client在遠程的,建議選用cluster mode。對於client就是集羣的某臺機器的情況,可以使用client mode,因爲這樣在客戶端就可以看到任務的運行情況,比如使用airflow做調度系統的時候,使用client mode在airflow的web頁面上直接就可以看到總體的日誌,而不用登錄ApplicationMaster的Web UI查看。

選用mode的方式可以在提交任務的時候通過參數--deploy-mode來指定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章