1.簡述node
Yarn是Hadoop2.X的核心組件之一.負責集羣的資源管理.(不侷限於Hadoop,Spark等等至關多的組件均可以利用Yarn來進行資源管理與調度)編程
Yarn自己由兩大組件構成:ResourceManager(RM)和NodeManager(NM).在Yarn中,整個資源管理依靠這兩大組件來共同完成.網絡
ResourceManager:框架
ResourceManager負責整個集羣的資源管理與分配.它自己再由兩個組件構成編程語言
應用程序管理器ApplicationManageroop
ApplicationManager是RM的中心入口,負責管理整個集羣的應用程序.包括應用程序的提交,與調度器協商資源,跟蹤分配的Container,啓動AppMaster,監控AppMaster執行狀態,失敗重啓等等性能
調度器(Scheduler)spa
調度器根據根據隊列,容量等等條件(好比每隊最多分配多少,最多執行做業數多少),整體上將系統中的資源分配給各個應用程序.操作系統
對於某一個應用程序,根據對該應用程序的請求進行資源分配.線程
資源分配的最終結果是一個Container.
NodeManager
NodeManager是每一個節點上的資源管理器和任務管理器.它會定時向RM彙報本節點的資源狀況和各個Container的運行狀態,並接收和實際處理來自ApplicationManager的Container啓動&暫停命令
2.核心概念
2.1 Container與資源隔離
Container,意義就像它的名字-容器.它是Yarn中對資源的一種抽象.它封裝的是某個節點的多維度資源(內存,CPU,磁盤,網絡等等),也是資源最終分配的結果與單位,
Container做爲容器的另外一個概念就是資源隔離.
資源隔離包含兩層含義,即
Container以內的運行使用資源的上限不會超過Container,
Container以外的運行不會佔用到Container以內的資源.
Container資源隔離的實際操縱者,是Yarn的NM.它針對不一樣的資源,可使用不一樣的隔離機制.具體見後
2.2 ApplicationMaster
ApplicationMaster是一種應用框架,這是Yarn跨越Hadoop能夠做爲不少框架的資源調度組件的基礎.
ApplicationMaster能夠是任何編程語言編寫的程序,它使用ProtocolBuf和ResourceManager.NodeManager進行交互.
它實際負責向ResourceManager申請協調資源,而且與NodeManager協同工做完成對任務的執行,監控等等(跟蹤應用程序狀態重啓失敗任務).
它的原生支持就是MR,但好比Spark,Storm等等不少都實現了本身的ApplicationMaster,因此才能夠譬如SparkOnYarn.
3.Yarn的工做流程
1.向Yarn提交一個應用程序.(這個應用程序自己就會包含幾個部分:用戶程序,ApplicationMaster程序,以及啓動ApplicationMaster的命令等)
2.ResourceManager將會爲這個應用程序分配第一個Container.而且會當即與這個Container所在的NodeManager通信,要求以這個Container啓動ApplicationMaster應用程序
3.ApplicationMaster被啓動後,會首先向ResourceManager註冊,這個時候應用程序已經正式啓動,能夠經過ResourceManager查看應用程序狀態了.
以後ApplicationMaster將接管應用程序,負責與ResourceManager通信爲以後的各個任務申請資源,監控狀態,重複如下4-7步驟直到整個任務結束
4.ApplicationMaster採用輪詢的方式經過RPC協議向ResourceManager申請資源
5.一旦申請到資源拿到Container,ApplicationMaster將會當即與Container所在的NodeManager通信,要求它啓動任務
6.NodeManager爲任務設置好運行環境(包括環境變量,Jar包,二進制程序等等),將任務啓動寫到一個腳本里,而後執行腳本啓動任務
7.各個任務經過RPC協議向ApplicationMaster彙報本身的狀態和進度,以便ApplicationMaster隨時重啓某個任務
8.任務所有結束後,ApplicationMaster向ResourceManager註銷並關閉本身
4.Yarn的資源隔離機制
Yarn的資源都是指可供使用的資源,好比應該刨除操做系統自己佔用,其它應用程序佔用等,Yarn自己不會智能探測節點的資源
4.1 內存隔離
Yarn的內存隔離默認是採用線程監控是否超量.一旦發現超量會當即殺死任務.
Java進程在建立之初內存會暴增而後迅速回復正常,因此採用線程監控會更加合適.Cgroups機制是任什麼時候候都不得超量,這樣很容易在進程啓動之初被殺死
Yarn的內存相關配置
yarn.nodemanager.resource.memory-mb Yarn上可以使用的物理內存,默認8192(MB),若是節點內存資源不足,則應酌情減小這個值(Yarn自己不會智能探測節點的內存總量)
yarn.nodemanager.vmem-pmem-ratio 任務每使用1MB物理內存,則可使用多少虛擬內存.默認2:1
yarn.nodemanager.pmem-check-enabled 是否啓動一個線程檢查每一個任務的物理內存使用量,若是超過度配值,則將其殺死.默認爲true
yarn.nodemanager.vmem-check-enabled 是否啓動一個線程檢查每一個任務的虛擬內存使用量,若是超過度配至,則將其殺死,默認爲true
yarn.scheduler.minimum-allocation-mb 單個任務可申請的最少內存量,默認1024(MB)
yarn.scheduler.maximum-allocation-mb 單個任務可申請的最大內存量,默認8192(MB)
4.2 CPU隔離
在Yarn中,由於考慮到不一樣的CPU的計算性能差異極大,CPU資源被從新定義了一個虛擬CPU的概念.對於高性能CPU,能夠配置更高的虛擬CPU配比率.
默認狀況下,Yarn不會對CPU進行調度,須要使用專門的資源管理器
Yarn的CPU相關配置
yarn.nodemanager.resource.cpu-vcores 表示該節點可以使用的虛擬CPU個數,默認爲8,建議配置爲物理核數,高性能CPU能夠配置爲2倍物理核數
yarn.scheduler.minimum-allocation-vcores 單個任務申請的最少核數,默認爲1
yarn.scheduler.maximum-allocation-vcores 單個任務申請的最大核數,默認爲32