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

2、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單點故障問題。ide

(2)資源利用率對比。oop

    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就是被閒置浪費了。相比之下,Yarn就克服了上面的問題,Yarn的資源抽象單位container是細粒度的,並且是動態的(目前Yarn版本中只支持cpu和內存的動態分配),他能夠爲不一樣的Task需求進行分配,並且container是部分種類的,在MRv框架中能夠同時被Map Task和Reduce Task使用。spa

(3)安全穩定性對比。日誌

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

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

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

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

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

wKioL1Ozo4jSaVcvAALDDq6YPkI735.jpg

基本組件介紹:

一、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的黑白名單等等。

二、ApplicationMaster(AM)

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

三、NodeManager(NM)

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

四、Container

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

4、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彙報本身所在節點的資源使用狀況。

5、總結

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