前段時間朋友圈刷爆了摩拜的胡阿姨套現了十五億,我也跟著激動,因為我也有十五億的數據要處理,那麼處理這麼多數據需要多少資源呢?怎麼分配資源才能保證集群不給累掛了?深入思考3分鐘。

照舊,開始今天的分享之前先來說個小故事,小時候看三國,認為最瀟洒的就是諸葛亮,所謂運籌帷幄決勝千里,所謂神機妙算足智多謀,但是諸葛亮是個事必躬親的人,事無巨細,不懂得放權,活活給累死的,活活給累死的,活活給累死的,重要的事說 3 遍。結論是:管的寬,掛的快。

YARN產生的背景

沒有YARN之前,MapReduce1.x架構圖

如圖所示:Master / Slave架構,1 個 JobTracker 帶多個 TaskTracker,JobTracker 是整個框架的核心,我們根據圖來看下JobTracker 到底要做什麼事:

1.JobTracker 接收客戶端提交的 job;

2.根據 job 提供的參數向 NameNode 請求獲取這些文件數據存放的 DataNode 的列表地址,這意味著要和 HDFS Metadata Server通訊;

3.JobTracker 要確定 job 的執行計劃:確定執行 job 的 Map Reduce 的 task 數量,並分配到離數據塊最近的節點上,這就 JobTracker 要確定哪些機器是活的,資源還剩多少;另外根據他們和數據分布的情況作出分配策略;

4.JobTracker 提交所有 task 到每個 TaskTracker 節點,TaskTracker 會定時的向 JobTracker 發送心跳,若一定時間沒有收到心跳,JobTracker 就默認這個 TaskTracker 節點掛了要做資源回收,並把這個節點上的 task 重新分配到其他節點上;

5.監聽 task 的執行情況,執行完成,JobTracker 會更新 job 的狀態為完成,若是一定數量的 task 執行失敗,這個 job 就會被標記為失敗;

6.JobTracker 將發送 job 的運行狀態信息給 Client 端;

綜合來說,JobTracker 既當爹又當媽,既要管理資源又要做任務調度,這不得活活把自己給累死。

1.1 MapReduce1.x 版本存在的問題:單點故障&節點壓力大不易擴展&不支持除了 MapReduce 之外的處理框架。

1.2 資源利用率低&運維成本高。

再來說說諸葛亮,他要是懂的簡政放權,也不至於英年早逝,太悲催了。我們再來看看隋唐時期的三省六部制,皇帝逍遙快活還能把國力發展的很鼎盛,唐朝存活了289年。那是為什麼呢?因為他們只負責統籌協調,具體事情有下面的每個機構來做。

下一代 MapReduce 框架的基本設計思想就是將 JobTracker 的兩個主要功能,即資源管理和作業控制(包括作業監控,容錯等)拆分成兩個獨立的進程,如下圖所示資源管理進程與具體應用程序分離,它只負責集群的資源(內存,CPU,磁碟)管理,而作業控制進程是直接與應用程序相關的模塊,且每個作業控制進程只負責管理一個作業。這樣通過將原有的 JobTracker 中與應用程序相關和無關的模塊分開,不僅減輕了 JobTracker 的負載,也使得 Hadoop 支持其他的計算框架。

下一代 MapReduce 框架基本架構

YARN概述

從資源管理角度看,下一代 MapReduce 框架實際上衍生出了一個資源統一管理平台YARN,YARN 的基本思想是將資源管理和作業調度/監控的功能分解為單獨的守護進程。這個包括 2 個部分,一個全局的資源調度 ResourceManager(RM)和針對每個應用程序的ApplicationMaster(AM)。應用程序可以只是一個工作也可以是一個 DAG(有向無環圖)工作。它使得 Hadoop 不再局限於僅支持 MapReduce 一種計算模型,而是可無限融入多種計算框架,且對這些框架進行統一管理和調度。

YARN 基本架構

如圖 ResourceManager (RM)和 NodeManager(NM) 組成了整個數據計算框架,在整個系統中,所有的應用程序所需的資源都由RM說了算,RM在這擁有至高無上的權利。NM是每台機器分配資源的代理人,NM負責監聽資源的使用個情況包括(CPU,內存,磁碟,網路),並實時向RM彙報。每個應用程序的ApplicationMaster(AM)實際上是一個特別的框架,AM的任務是負責向RM申請所需資源,獲取資源後跟NM一起合作執行並監督任務的完成情況。我們來分別詳細的介紹一下各個模塊的功能作用:

ResourceManager:全局的資源管理者,整個集群只有唯一的一個,負責集群的資源統一管理和分配調度:

1.處理客戶端的請求

2.啟動監控 ApplicationMaster

3.監控 NodeManager

4.資源分配調度

NodeManager:整個集群中有多個,負責自己本身節點的資源管理使用:

1.定時向RM彙報本節點的資源情況

2.單個節點上的資源任務管理

3.執行 NodeManager 的命令:啟動 Container

4.協助 ApplicationMaster處理任務

5.管理著抽象的資源容器,這些容器代表著一個應用程序針對每個節點上的資源

ApplicationMaster:管理應用程序在yarn上的每個實例:

1.每個應用程序對應一個:MR、Spark,負責應用程序的管理

2.為應用程序向RM申請資源(core、memory),分配給內部task

3.需要與 NM 通信:啟動/停止 task,task 是運行在 container 裡面,AM 也是運行在 container 裡面

Container:YARN 中的資源抽象,封裝了該節點上的多維度資源:

1.封裝了 CPU、Memory 等資源的一個容器

2.是一個任務運行環境的抽象,且該任務只能使用該 container 中描述的資源

那麼 YARN 框架相對於老的 MapReduce 框架有什麼優勢呢?

YARN 作為一個資源管理系統,其最重要的兩個功能就是資源調度和資源隔離,通過 RM 實現資源調度,隔離則由各個 NM 實現。

資源調度指的是 RM 可以將某個 NM 上的資源分配給任務,而資源隔離則是 NM 按照任務需要提供相應的資源,保證這些資源的獨佔性,為任務運行提供保證。具體來說就是老的框架中 JobTracker 很大的一個負擔就是要監控 job 中 task 的運行情況,現在這部分有 ApplicationMaster來完成。

補充一點:ResourceManager 有兩個主要組件:Scheduler 和 ApplicationsManager。ApplicationsManager 用來監控 ApplicationMaster的運行情況,如果出問題會在其他機器上重啟。

如上圖所示,hadoop1.0 版本只支持 MapReduce 計算,而2.0多了 yarn 這個集群資源管理框架,這樣的好處就是不同的計算框架(Spark/MapReduce/Storm/Flink)可以共享一個hdfs集群上的數據,享受整體的資源調度,按需分配,進而提高集群資源的利用率。這就好比yarn成為了 hadoop 的操作系統,只要你符合我的標準,就可以安裝不同的軟體。

YARN執行流程

1.客戶端向yarn提交作業,首先找 RM 分配資源;

2.RM 接收到作業以後,會與對應的 NM 建立通信;

3.RM 要求 NM 創建一個 Container 來運行 ApplicationMaster 實例;

4.ApplicationMaster 會向 RM 註冊並申請所需資源,這樣 Client 就可以通過 RM 獲知作業運行情況;

5.RM 分配給 ApplicationMaster 所需資源,ApplicationMaster 在對應的 NM 上啟動 Container;

6.Container 啟動後開始執行任務,ApplicationMaster 監控各個任務的執行情況並反饋給 RM;

其中 ApplicationMaster 是可插拔的,可以替換為不同的應用程序。

PS:很多讀者在公眾號給我留言問我如何自學入門,希望我能提供一些學習材料,感謝讀者厚愛,我正在整理一些關於大數據入門的學習材料,預計下期開始分階段釋放,莫急莫急。

本公眾號開通的較晚,所以文章還沒有留言功能,有任何問題都可以在公眾號給我發信息留言。

如果覺得文章不錯,歡迎轉發點贊,另外有錯誤歡迎留言指出,謝謝。

weixin.qq.com/r/Bilza57 (二維碼自動識別)

歡迎關注我的公眾號:Jianpan

更多好文,敬請期待!


推薦閱讀:
相关文章