Yarn大體框架和工作流程研究

一、概述

    將公司集羣升級到Yarn已經有一段時間,自己也對Yarn也研究了一段時間,現在開始記錄一下自己在研究Yarn過程中的一些筆記。這篇blog主要主要從大體上說說Yarn的基本架構以及其各個組件的功能。另外,主要將Yarn和MRv1做詳細對比,包括Yarn相對於MRv1的各種改進。最後,大概說說Yarn的工作流情況。

二、Yarn和MRv1對比

(1)擴展性對比。

    在MRv1中,JobTracker是個重量級組件,集中了資源管理分配、作業控制兩大核心功能,隨着集羣規模的增大,JobTracker處理各種RPC請求負載過重,這也是系統的最大瓶頸,嚴重製約了Hadoop集羣的擴展性。相比之下,Yarn將JobTracker功能進行了拆分,拆分爲全局組件ResourceManager、應用組件ApplicationMaster和JobHistoryServer。其中,ResourceManager負載整個系統資源的管理和分配,ApplicationMaster負載單個應用程序的相關管理(job的管理),JobHistoryServer負載日誌的展示和收集工作。Yarn的這種功能拆分,將減輕了master節點的負載,其處理的RPC請求的壓力得到減少。其實換句話Yarn是將這種負載進行了橫向轉移到子節點,這個可以通過ApplicationMaster(簡稱APP Mstr)的機制體現,APP Mstr是運行在其中一個子節點,運行在其他各個子節點的Task只需要向App Mstr發送相關的RPC請求來彙報task運行情況就ok,而不需要直接和master節點的相關進行進行RPC通訊。這個就將MRv1的Master/slave轉化爲了Master/slave混雜slave/slave的這種結構。

    另外,Hadoop1.x擴展性差問題不僅僅體現在MRv1框架中,提體現在HDSF中。Yarn爲了解決這個問題,提出了HDFS Federation,它可以允許集羣中啓動多個NameNode來分管不同目錄的元數據進而實現了訪問隔離和橫向擴展問題,同時HDFS Federation的提出也徹底解決了hadoop1.x的NameNode單點故障問題。

(2)資源利用率對比。

    MRv1的資源管理分配模型是基於槽位的,槽位是一個相當粗粒度的系統資源單位,一個槽位是系統一定cpu、內存、網絡、IO等資源的抽象。一個Slot只能啓動一個Task,關鍵的是一個Task未必用完一個Slot所對應的系統資源,但是它又佔着不給別的Task使用,這就造成了浪費。另外,在MRv1中Slot還被分爲了Reduce Solt和Map Slot,Reudce solt只能啓動Reduce Task,Map Slot只能啓動Map Task,這兩種Slot不允許共享,因此常常會導致一種Slot資源相當緊張而另外一種Slot資源卻是空閒的。例如,當一個Job剛剛被提交的時候,只有當Map Task完成數據爲總數量的5%(默認)時,Reduce Task纔會啓動,那麼此時的Reudce Slot就是被閒置浪費了。另外,如果想了解更多關於MRv1的資源管理方案的話,請看看我之前寫的blog:http://zengzhaozheng.blog.51cto.com/8219051/1362100 。相比之下,Yarn就克服了上面的問題,Yarn的資源抽象單位container是細粒度的,而且是動態的(目前Yarn版本中只支持cpu和內存的動態分配),他可以爲不同的Task需求進行分配,而且container是部分種類的,在MRv框架中可以同時被Map Task和Reduce Task使用。

(3)安全穩定性對比。

    Hadoop1.x對應的HDFS版本中NameNode是存在單點故障的,但是Yarn通過HFDS Federation的提出完美地解決了這個棘手問題。

(4)基本架構特性對比。

    MRv1是單純地爲離線框架Map Reduce打造的,而這種離線計算機框架不能滿足現在需求了,一些更有針對性的框架被開發出來,如Spark、storm、DAG計算機框架Tez。這些新的框架無法運行在MRv1上。相比之下,Yarn是一個獨立的資源管理系統,其資源和計算機框架是被分離開來的,你可以在Yarn上同時運行MR APP、Spark APP、MPI APP等等。

三、Yarn基本架構以及各個組件負責功能

    Yarn在整體上看還是採用了和Hadoop1.x一樣的Master/Slave結構(橫向擴展混雜Slave/Slave結構),在整個Yarn資源管理系統當中,ResourceManager作爲Master,各個節點的NodeManager作爲Slave。各個節點上NodeManager的資源由ResourceManager統計進行管理和調度。當應用程序提交後,會有一個單獨的Application來對該應用程序進行跟蹤和管理,同時該Application還會爲該應用程序想Resource申請資源,並要求NodeManager啓動該應用程序佔用一定資源的任務。下圖主要以MR和MPI這兩種應用來描述Yarn運行的基本架構:

wKioL1Ozo4jSaVcvAALDDq6YPkI735.jpg

基本組件介紹:

1、ResourceManager

    ResourceManager是Yarn的核心組件,主要由任務調度器(YarnScheduler)和應用程序管理器(Applications Manager)組成。其主要功能是負責系統資源的管理和分配。

  • 任務調度器(YarnScheduler)

    任務調度器根據系統資源容量以及管理員對隊列的限制條件,按照一定的策略將資源分配給正在運行的應用程序。相比於Hadoop1.x而言,Yarn爲任務調度器做了減負,任務調度器不再負責跟蹤和監控應用的執行狀態,也不負責重新啓動因爲應用執行失敗或者硬件故障而運行失敗的任務,這些任務都有該應用程序對應的ApplicationMaster來負責了,這使得YarnScheduler的功能更加純粹。另外,任務調度器和Hadoop1.x一樣也是一個熱插拔模塊,你可以自定義自己的任務調度器,同樣你也可以直接使用其他任務調度器,如,Fair Scheduler或者Capacity Scheduler。

  • 應用程序管理器(Applications Manager)

    應用程序管理器,負責管理整個系統中所有應用程序,包括應用程序提交、向任務調度器申請資源啓動ApplicationMaster、監控ApplicationMaster運行狀態並在失敗時重新啓動它。

  • 其他


    ResourceManager中還包含了其他組件,如ResourceTrackerService用來直接處理心跳,NMLivelinessMonitor用來監控NodeManager,NodesListManager 提供NodeManager的黑白名單等等。

2、ApplicationMaster(AM)

    每當用戶提交了一個應用程序就會爲這個應用程序產生一個對應的ApplicationMaster,並且這個這個單獨進程是在其中一個子節點上運行的。它的主要功能:爲應用向ResourceManager申請資源、在job對Task實行調度、與NodeManager通信以啓動或者停止任務、監控所有任務的運行情況,並且在任務失敗的情下,重新爲任務申請資源並且重啓任務、負責推測任務的執行、當ApplicationMaster向ResourceManager註冊後,ApplicationMaster可以提供客戶端查詢作業進度信息等。

3、NodeManager(NM)

    NM是每個子節點上的資源和任務管理器,一方面,它會定向通過心跳信息向RM彙報本節點上的資源使用情況和各個Container的運行情況;另一方面,它會接收並且處理來自AM的Container啓動和停止的各種請求。它的能有點像Hadoop1.x中的TaskTracker。

4、Container

    Container是Yarn中對系統資源的抽象,同時它也是系統資源分配的基本單位,它封裝節點上多維度資源,其中包括CPU、內存、磁盤、網絡等。Yarn會爲每個任務分配一個Container,並且該任務只能夠使用該Container中所描述的資源。值得關注的的是,Yarn中的Container和MRv1中的Slot是完全不同的,Container是一個動態的資源劃分單位,它是根據實際提交的應用程序所需求的資源自動生成的,換句話說,Container其裏邊所描述的CPU、內存等資源是根據實際應用程序需求而變的。而Slot是一個靜態的資源抽象單位,每一個同類型的Slot所描述的資源信息都是一樣的。

四、Yarn工作流

    當用戶給Yarn提交了一個應用程序後,Yarn的主要工作流程如下圖:

wKiom1O0-6LhvCpYAALI8xesCO4652.jpg

  • 步驟1,用戶向Yarn提交應用程序,其中包括用戶程序、相關文件、啓動ApplicationMaster命令、ApplicationMaster程序等。

  • 步驟2,ResourceManager爲該應用程序分配第一個Container,並且與Container所在的NodeManager通信,並且要求該NodeManager在這個Container中啓動應用程序對應的ApplicationMaster。

  • 步驟3,ApplicationMaster首先會向ResourceManager註冊,這樣用戶纔可以直接通過ResourceManager查看到應用程序的運行狀態,然後它爲準備爲該應用程序的各個任務申請資源,並監控它們的運行狀態直到運行結束,即重複後面4~7步驟。

  • 步驟4,ApplicationMaster採用輪詢的方式通過RPC協議向ResourceManager申請和領取資源。

  • 步驟5,一旦ApplicationMaster申請到資源後,便會與申請到的Container所對應的NodeManager進行通信,並且要求它在該Container中啓動任務。

  • 步驟6,任務啓動。NodeManager爲要啓動的任務配置好運行環境,包括環境變量、JAR包、二進制程序等,並且將啓動命令寫在一個腳本里,通過該腳本運行任務。

  • 步驟7,各個任務通過RPC協議向其對應的ApplicationMaster彙報自己的運行狀態和進度,以讓ApplicationMaster隨時掌握各個任務的運行狀態,從而可以再任務運行失敗時重啓任務。

  • 步驟8,應用程序運行完畢後,其對應的ApplicationMaster會向ResourceManager通信,要求註銷和關閉自己。


  這個需要注意的是在整個工作流程當中,ResourceManager和NodeManager都是通過心跳保持聯繫的,NodeManager會通過心跳信息向ResourceManager彙報自己所在節點的資源使用情況。

五、總結

    本文主要介紹了Yarn和Hadoop1.x的一些區別,以比較粗粒度的方式介紹了Yarn的基本架構以及其組成的各個組件功能。另外,簡單的研究了Yarn的工作流程。下篇blog細粒度分析對ResourceManager的各個功能進行研究。



參考文獻:

  1. 《hadoop技術內幕:深入解析YARN架構設計與實現原理》機械工業出版社.董西城

  2. http://hadoop.apache.org/docs/r2.2.0/ 

  3. http://hadoop.apache.org/docs/r2.2.0/hadoop-yarn/hadoop-yarn-site/YARN.html 

  4. http://hadoop.apache.org/docs/r2.2.0/hadoop-yarn/hadoop-yarn-site/WritingYarnApplications.html#Concepts_and_Flow 


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