hadoop系列之yarn
YARN
-
- YARN概述
YARN,即 Yet Another Resource Negotiator 的縮寫, 它是 Hadoop 資源管理系統,是在 Hadoop2 以後引入的。它在整個 Hadoop 中的位置如下:
-
- YARN 與 MapReduce1
MapReduce1 指 Hadoop1.x 中的 MapReduce 分散式執行框架,用以區別使用了 YARN 的 MapReduce2。
-
-
- MapReduce1的機制
-
MapReduce1 由兩類守護程序來控制作業的執行:一個 jobtracker 以及一個或多個 tasktracker。jobtracker 通過排程 tasktracker 上執行的任務來協調所有執行在系統上的作業。同時,tasktracker 在執行任務的同時會將執行進度上報給 jobtracker。
從上面的描述中可以看到,jobtracker 同時負責任務排程和進度監控。而在 YARN 架構中,這些職責是由不同的實體承擔的。
-
-
- YARN與 MapReduce1對比
- 可擴充套件性
- YARN與 MapReduce1對比
-
由於 MapReduce1 總的 jobtracker 必須同時管理作業排程和任務跟蹤,當叢集的規模超過一定程度(比如節點數超過 4000,任務數超過 40000),MapReduce1 就會遇到擴充套件瓶頸。而在 YARN 中,作業排程由
ResourceManager 負責,任務的跟蹤由 NodeManager 中的 Application Master 負責。YARN 利用資源管理器與
Application Master 分離的架構解決 了這個侷限,可以擴充套件到近 10000 個節點和 100000 個任務。
-
-
-
- 可用性
-
-
由於 MapReduce1 中的 jobtracker 記憶體中包含大量快速變化的負責狀態(比如任務的執行狀態),這使得改進
jobtracker 讓其具有高可用非常困難。
但 YARN 中將作業排程和跟蹤職責劃分之後,就變成了分別對資源管理器和 YARN 應用的高可用,而對
ResourceManager 高可用和 YARN 應用的高可用要容易得多。後面分別會有詳細介紹。
-
-
-
- 利用率
-
-
MapReduce1 中為每個 tasktracker 分別的 slot 是固定長度的,而且區分了 map slot 和 reduce slot,這會導致兩者任務不匹配的時候,其中的一類 slot 空閒,利用率不足。
而 YARN 中,一個節點管理器管理一個資源池,而不是固定數目的 slot。不會出現 MapReduce1 中的情況。
-
-
-
- 多租戶
-
-
YARN 不僅僅適用於 MapReduce,它對外開放了 Hadoop,可以在 YARN 上執行包括 MapReduce1、
MapReduce2 以及其他應用,如 Spark 等。
-
- YARN解析
- 架構剖析
- YARN解析
YARN 按功能可分為資源管理器和任務的排程與監控,並將它們分別納入兩個獨立的守護程序。基本思想為一個全域性的 ResourceManager 和每個應用節點執行一個 NodeManager。
ResourceManager 全權負責整個叢集的資源管理,而每個節點上的 NodeManager 則負責容器、監控該節點資源的使用並將它們報告給 ResourceManager 節點。
ResourceManager 包含兩個元件:即 Scheduler 和 ApplicationsManager。
Scheduler 負責資源的排程,它是可插拔的,比如支援 CapacityScheduler,FairScheduler 等。
ApplicationsManager 負責接受作業請求,協商第一個 Container 來啟動應用特定 ApplicationMaster,並負責在
ApplicationMaster 失敗的時候重啟。
每個應用會有一個 ApplicationMaster,它負責向 ResourceManager 的 Scheduler 申請資源,並跟蹤作業的狀態和監控整個過程。
-
-
- 工作機制
-
YARN 的工作機制
YARN 作業的工作流程:
第一步:MapReduce 客戶端程式中的 main 中執行 runjob,開始作業;
第二步:客戶端程式向 RM 傳送作業請求同時 RM 將作業 id 以及存放 jar 包的 hdfs 目錄返回給客戶端;
第三步:客戶端會把切片資訊、job 的配置資訊以及 jar 包上傳到上一步收到的 hdfs 目錄下(三個檔案分別為
job.split、job.xml、jar 包);
第四步:客戶端應用提交給 RM;
第五步:RM 將其放入排程器,尋找一個空閒的 NM 建立第一個 Container 容器,並啟動 MRAppMaster 程序;
第六步:NM 通過心跳機制接受排程器分配的任務,初始化一個 job;
第七步:MRAppMaster 從 HDSF 中獲取需要的資料,如分片資訊。這些資料在第三步中存入;
第八步:MRAppMaster 向 RM 申請執行 job 所需的資源,RM 選擇一個擁有相應資源的 NM 返回; 第九步:MRAppMaster 告知選中的 NM,啟動一個 YarnChild Container 容器;
第十步:YarnChild 從 HDFS 中獲取執行 map 和 reduce 任務所需的資源; 第十一步:YarnChild 執行 MapTask 或者 Reduce Task
-
-
- 內建排程器
- FIFO排程器
- 內建排程器
-
FIFO 為 First Input First Output 的縮寫,先進先出。FIFO 排程器將應用放在一個佇列中,按照先後順序執行應用。這種策略較為簡單,但不適合共享叢集,因為大的應用會佔用叢集的所有資源,每個應用必須等待直到輪到自己。
-
-
-
- 容量排程器容量排程器 Capacity
-
-
-
-
-
- 公平排程器
-
-
公平排程器的目的就是為所有執行的應用公平分配資源。
-
- YARNHA
-
-
- YARNHA架構
-
YARN HA 主要是為了解決 YARN 中的 ResourceManager 的單點故障。ResourceManager 的 HA 是通過主備
(Active/Standby)方案來實現。
在任何時候,都只有一個 ResourceManager 是 Active 的,另外一個處於 Standby 狀態,一旦 Active 節點出現故障,隨時準備接管 Active 節點。主備的切換通常由管理員發起的命令或者整合的 failover-controller 來觸發。
YARN HA 架構圖
-
-
- 主備切換
-
手動切換/自動切換相關配置涉及 yarn-site.xml 中的 yarn.resourcemanager.ha.automatic-failover.enabled 配置項。預設情況下,當 yarn.resourcemanager.ha.enabled 為 true 的時候它就為 true。