大數據篇:YARN
YARN是什么?
YARN是一種新的 Hadoop 資源管理器,它是一個通用資源管理系統,可為上層應用提供統一的資源管理和調度,它的引入為集群在利用率、資源統一管理和數據共享等方面帶來了巨大好處。
如果沒有YARN!
- 無法管理集群資源分配問題。
- 無法合理的給程序分配合理的資源。
- 不方便監控程序的運行狀態及日志。
1 YARN概念
1.1 基本架構
- ResourceManager
- 整個集群只有一個,負責集群資源的統一管理和調度
- 處理客戶端請求,啟動/監控ApplicationMaster
- 監控NodeManager,匯總上報資源
- 資源分配與調度
- NodeManager
- 整個集群有多個(每個從屬節點一個)
- 單個節點上的資源管理和任務管理
- 監控資源使用情況(cpu,memory,disk,network)並向ResourceManager匯報
- 基本思想衍進
- 在MapReduce1.0中 JobTracker = 資源管理器 + 任務調度器
- 擁有yarn后,將資源管理器,任務調度器做了切分
- 資源管理
- 讓ResourceManager負責
- 任務調度
- 讓ApplicationMaster負責
- 每個作業啟動一個
- 根據作業切分任務的tasks
- 向ResourceManager申請資源
- 與NodeManager協作,將分配申請到的資源給內部任務tasks
- 監控tasks運行情況,重啟失敗的任務
- 讓ApplicationMaster負責
- 資源管理
- JobHistoryServer
- 每個集群每種計算框架一個
- 負責搜集歸檔所有的日志
- Container
- 計算資源抽象為Container
- 任務運行資源(節點、內存、CPU)
- 任務啟動命令
- 任務運行環境
1.2 基本架構 YARN運行過程剖析
1. 客戶端發送請求,由Resource Manager分析需要多少內存資源。
2. Resource Manager告訴Node Manager用什么樣的jar包什么樣的啟動命令。
3. Node Manager創建Container,在Container啟動Application Master。
4. Application Master向Resource Manager發送ResourceRequest請求去Resource Manager申請資源
5. 啟動對應的Node Manager進行通信
6. Node Manager找到對應的Container執行Task
1.3 YARN容錯性
- 失敗類型
- 程序失敗 進程崩潰 硬件問題
- 如果作業失敗了
- 作業異常會匯報給Application Master
- 通過心跳信號檢查掛住的任務
- 一個作業的任務失敗比例超過配置,就會認為該任務失敗
- 如果Application Master失敗了
- Resource Manager接收不到心跳信號時會重啟Application Master
- 如果Node Manager失敗了
- Resource Manager接收不到心跳信號時會將其移出
- Resource Manager接收Application Master,讓Application Master決定任務如何處理
- 如果某個Node Manager失敗任務次數過多,Resource Manager調度任務時不再其上面運行任務
- 如果Resource Manager運行失敗
- 通過checkpoint機制,定時將其狀態保存到磁盤,失敗的時候,重新運行
- 通過Zooleeper同步狀態和實現透明的HA
1.4 YARN調度框架
- 雙層調度框架
- RM將資源分配給AM
- AM將資源進一步分配給各個Task
- 基於資源預留的調度策略
- 資源不夠時,會為Task預留,直到資源充足
- 與“all or nothing”策略不同(Apache Mesos)
1.5 YARN資源調度算法
-
集群資源調度器需要解決:
- 多租戶(Multi-tenancy):
- 多用戶同時提交多種應用程序
- 資源調度器需要解決如何合理分配資源
- 可擴展性:增加集群機器數量可以提高整體集群性能。
- 多租戶(Multi-tenancy):
-
Yarn使用列隊解決多租戶中共享資源的問題
-
root
|---prd
|---dev
|---eng
|---science
-
-
支持三種資源調度器(yarn.resourcemanager.scheduler.class)
-
FIFO
- 所有向集群提交的作業使用一個列隊
- 根據提交作業的順序來運行(先來先服務)
- 優點:簡單,可以按照作業優先級調度
- 缺點:資源利用率不高,不允許搶占
-
Capacity Scheduler
-
設計思想:資源按照比例分配給各個列隊
-
計算能力保證:以列隊為單位划分資源,每個列隊最低資源保證
-
靈活:當某個列隊空閑時,其資源可以分配給其他的列隊使用
-
支持優先級:單個列隊內部使用的就是FIFO,支持作業優先級調度
-
多租戶:
- 考慮多種因素防止單個作業,用戶列隊獨占資源
- 每個列隊可以配置一定比例的最低資源配置和使用上限
- 每個列隊有嚴格的訪問控制,只能向自己列隊提交任務
-
基於資源調度:支持內存資源調度和CPU資源的調度
-
從2.8.0版本開始支持搶占
-
root
|---prd 70%
|---dev 30%
|---eng 50%
|---science 50%
-
-
Fair Scheduler(推薦)
- 設計思想:資源公平分配
- 具有與Capacity Scheduler相似的特點
- 樹狀隊列
- 每個列隊有獨立的最小資源保證
- 空閑時可以分配資源給其他列隊使用
- 支持內存資源調度和CPU資源調度
- 支持搶占
- 不同點
- 核心調度策略不同
- Capacity Scheduler優先選擇資源利用率低的列隊
- 公平調度器考慮的是公平,公平體現在作業對資源的缺額
- 單獨設置列隊間資源分配方式
- FAIR(只考慮Mamory)
- DRF(主資源公平調度,共同考慮CPU和Mamory)
- 單獨設置列隊內部資源分配方式
- FAIR DRF FIFO
- 核心調度策略不同
-
-
多類型資源調度
- 采用DRF算法(論文:“Dominant Resource Fairness: Fair Allocation of
Multiple Resource Types”) - 目前支持CPU和內存兩種資源
- 采用DRF算法(論文:“Dominant Resource Fairness: Fair Allocation of
-
多租戶資源調度器
- 支持資源按比例分配
- 支持層級隊列划分方式
- 支持資源搶占
配置案例
-
調用Wordcount案例,看看效果吧
-
hadoop jar /opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/lib/hadoop-mapreduce/hadoop-mapreduce-examples-3.0.0-cdh6.2.0.jar wordcount -Dmapreduce.job.queuename="root.default" /word.txt /output #任務2將會失敗root.users is not a leaf queue,有了自列隊就不能提交 hadoop jar /opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/lib/hadoop-mapreduce/hadoop-mapreduce-examples-3.0.0-cdh6.2.0.jar wordcount -Dmapreduce.job.queuename="root.users" /word.txt /output1 hadoop jar /opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/lib/hadoop-mapreduce/hadoop-mapreduce-examples-3.0.0-cdh6.2.0.jar wordcount -Dmapreduce.job.queuename="root.users.dev" /word.txt /output2 hadoop jar /opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/lib/hadoop-mapreduce/hadoop-mapreduce-examples-3.0.0-cdh6.2.0.jar wordcount -Dmapreduce.job.queuename="root.users.test" /word.txt /output3
1.6 YARN資源隔離方案
- 支持內存和CPU兩種資源隔離
- 內存是一種“決定生死”的資源
- CPU是一種“影響快慢”的資源
- 內存隔離
- 基於線程監控的方案
- 基於Cgroups的方案
- CPU隔離
- 默認不對CPU資源進行隔離
- 基於Cgroups的方案
1.7 YARN支持的調度語義
- 支持的語義
- 請求某個特定節點/機架上的特定資源量
- 將某些節點加入(或移除)黑名單,不再為自己分配這些節點上的資源
- 請求歸還某些資源
- 不支持的語義
- 請求任意節點/機架上的特定資源量
- 請求一組或幾組符合某種特質的資源
- 超細粒度資源
- 動態調整Container資源
1.8 YARN常用命令
- 列出所有的Application: yarn application -list
- 根據Application狀態過濾: yarn application -list -appStates ACCEPTED
- Kill掉Application: yarn application -kill [ApplicationId]
- 查看Application日志: yarn logs -applicationId [ApplicationId]
- 查詢Container日志:yarn logs -applicationId [ApplicationId] -containerId [containerId] -nodeAddress [nodeAddress]
- 配置是配置文件中:yarn.nodemanager.webapp.address參數指定
2 Hadoop YARN應用
2.1 應用程序種類繁多
2.2 YARN設計目標
- 通用的統一資源管理系統
- 同時運行長應用程序和短應用程序
- 長應用程序
- 通常情況下,永不停止運行的程序
- Service、HTTP Server等
- 短應用程序
- 短時間(秒級、分鍾級、小時級)內會運行結束的程序
- MR job、Spark Job等
2.3 以YARN為核心的生態系統
2.4 運行在YARN上的計算框架
- 離線計算框架:MapReduce
- DAG計算框架:Tez
- 流式計算框架:Storm
- 內存計算框架:Spark
3 監控頁面
4 YARN HA
從圖中看出yarn的HA相對於HDFS的HA簡單很多。原因是YARN在開發的過程中,HDFS才考慮到HA的應用(在出2.0版本),HDFS為了老代碼的兼容性,和新代碼的可拓展性加入了ZKFailoverController(ZKFC)來處理ZK相關的業務。而YARN就直接將ZK的相關的業務規划進了源架構中,所以架構圖看起來比HDFS HA簡單很多。
4.1 CDH中YARN配置HA
也很簡單,一步完成。
5 參數調優
5.1 內存利用優化
- yarn.nodemanager.resource.memory-mb
單個節點可用內存,表示該節點上YARN可使用的物理內存總量。
- yarn.scheduler.maximum-allocation-mb
單個任務可申請的最多物理內存量
一般出現資源不夠的情況就需要調整上述兩個參數,比如前面來了1個G數據,分成10個塊,每一個map占用1G內存,那么需要10G,4個reduce任務一個1G內存,這時候yarn.scheduler.maximum-allocation-mb參數就必須大於14G,而如果有2個這種任務,那么yarn.nodemanager.resource.memory-mb參數就必須大於28G。