Yarn初步瞭解

    項目中打算Spark任務都放到Yarn上統一進行資源管理,所以打算分析Spark on Yarn的運行流程和Yarn自身的資源管理機制,在此之前先大概瞭解下一般Yarn上的任務大致是怎麼運行起來的。

 

Yarn架構簡介:

    YARN 是在 MRv1 基礎上演化而來的,爲了解決MRv1無法支持多種計算框架、資源利用率低、擴展性差和可靠性差等問題。將其中的資源管理功能抽象出來做成了獨立的通用系統Yarn,它主要包括如下幾個部分:

    ResourceManager(RM):負責整個系統的資源管理和分配,主要由Scheduler和Applications Manager組成。調度器根據容量、隊列等限制條件(如每個隊列分配一定的資源, 最多執行一定數量的作業等),將系統中的資源分配給各個正在運行的應用程序;應用程序管理器負責管理整個系統中所有應用程序,包括應用程序提交、與調度器協商資源以啓動ApplicationMaster、監控 ApplicationMaster 運行狀態並在失敗時重新啓動它等等。

    NodeManager(NM):每個節點上的資源和任務管理器。一方面會向RM會報本節點上的資源使用情況和各個Container的運行狀態;另一方面會接受來自AM的Container啓動/停止等各種請求。

ApplicationMaster(AM):用於提交的程序,主要負責與RM的Scheduler協商獲取資源(Container);與NM通信用以啓動/停止任務;監控任務運行狀態,失敗是重新申請資源以重啓任務

Container:可以理解爲資源抽象,理解爲內存、CPU資源隔離的進程,使用的是Cgroups技術。

    YARN總體上仍然是Master/Slave結構,在整個資源管理框架中,RM爲Master,NM爲 Slave,RM負責對各個NM上的資源進行統一管理和調度。當用戶Client提交一個應用程序時,需要提供一個用以跟蹤和管理這個程序的AM,它負責向 RM申請資源,並要求NM啓動可以佔用一定資源的任務。由於不同的AM被分佈到不同的節點上,因此它們之間不會相互影響。

 

應用程序的開發:

Yarn上的任務運行包含兩個階段:第一階段是啓動AM;第二階段是由AM創建應用程序,爲程序申請資源並監控整個程序的執行流程直到運行完成退出。應用程序運行流程如下:

1、客戶端程序向ResourceManager提交應用並請求一個ApplicationMaster實例。

 

2、ResourceManager找到可以運行一個Container的NodeManager,並在這個Container中啓動ApplicationMaster實例。

 

3、ApplicationMaster向ResourceManager進行註冊,註冊之後客戶端就可以查詢ResourceManager獲得自己ApplicationMaster的詳細信息,以後就可以和自己的ApplicationMaster直接交互了。

 

4、在平常的操作過程中,ApplicationMaster根據resource-request協議向ResourceManager發送resource-request請求。

 

5、當Container被成功分配之後,ApplicationMaster通過向NodeManager發送container-launch-specification信息來啓動Container, container-launch-specification信息包含了能夠讓Container和ApplicationMaster交流所需要的資料。

 

6、應用程序的代碼在啓動的Container中運行,並把運行的進度、狀態等信息通過application-specific協議發送給ApplicationMaster。

 

7、在應用程序運行期間,提交應用的客戶端主動和ApplicationMaster交流獲得應用的運行狀態、進度更新等信息,交流的協議也是application-specific協議。

 

8、一旦應用程序執行完成並且所有相關工作也已經完成,ApplicationMaster向ResourceManager取消註冊然後關閉,用到所有的Container也歸還給Yarn。

 

對於開發者來說需要編寫的是Client和ApplicationMaster兩個部分的代碼。Client是向Yarn提交ApplicationMaster,這個寫起來還是蠻簡單的。但是ApplicationMaster編寫起來非常複雜!因爲需要實現容器管理和容錯,以便在失敗時可回滾至前一狀態。這兩部分的代碼具體怎麼編寫可見參考鏈接中的“3”,有大神已經總結的很好了,這裏我就不搬運他人的勞動成果了。

感覺和Spark的client和cluster模式很像...

 

補充:Yarn資源隔離技術介紹:

    Yarn的資源主要指兩部分:CPU + 內存

    CPU隔離技術是基於Cgroups實現的。Cgroups是Linux內核提供的一種可以限制進程使用資源的一種機制,可以對CPU、內存、IO等部分的資源進行控制。Yarn使用了其中的CPU子系統(基於Linux CFS調度器實現,理論上CFS能使每個進程都能同時獲取CPU的執行實現),控制進程所使用的時間片來達到控制CPU使用率的功能。

    但是Yarn的內存監控默認情況不是基於Cgroups技術實現的,而是額外在每個NodeManager上啓動一條線程去監控各個Container的內存使用情況,一旦發現某個任務內存過量,則直接將其殺死。之所以不使用Cgroups來進行內存資源隔離,Yarn那本書上7.7節中講到過當前這個方案暫未合併到Yarn內核中。

 

 

 

參考:

    《Hadoop技術內幕:深入解析YARN的架構設計和實現原理》

     http://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/WritingYarnApplications.html(Writing YARN Applications)

      https://blog.csdn.net/qq_24084925/article/details/79528327(在Yarn上運行Hello World)

      https://my.oschina.net/u/1434348/blog/193374(Yarn應用程序開發和設計流程)

      https://blog.csdn.net/u011007180/article/details/52422642

      https://blog.51cto.com/13616359/2311054(Linux中的Cgroups介紹)

      https://www.jianshu.com/p/fd6bb46d8659(Cgroups在Docker中的作用)

      https://www.jianshu.com/p/e283ab7e2530(Yarn使用Cgroups的兩種方式)

      https://blog.51cto.com/sunzeduo/1320788(Linux下的fork與exec)

 

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