YARN——Hadoop的叢集資源管理系統
相對於昨天的HDFS,YARN明顯難一些。
聽過大資料的人最多,聽過Hadoop的次之,聽過YARN的再次之。
本文參考官方文件以及百度百科,去除了一些跟上一代的資源排程管理系統的對比,只求略懂一二,為後面的MapReduce任務鋪路。
YARN,Ye Another Resource Negotiator——Hadoop的叢集資源管理系統。
它負責以下事情:
- Resource Management 資源管理
- Job Scheduling / Monitoring 任務排程、監控
YARN本身非常複雜,詳細的文件請參考官方:
https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/YARN.html
開始吧!
“資源”是什麼?
記憶體、CPU、硬碟、網路……
YARN把這些資訊封裝起來,用一個概念來表示——Container(容器)
一般來說,1個Container可以執行一個任務(task)
日後Container的內容可能會更加豐富,比如顯示卡或專用處理器也可能會加入(人工智慧改變世界)
Conainer是一個動態資源劃分單位,根據app的需求動態產生。我理解它更像一臺臺虛機,可以獨立執行程式碼(task)。
以下是別人的部落格:
Container的一些基本概念和工作流程如下:
(1) Container是YARN中資源的抽象,它封裝了某個節點上一定量的資源(CPU和記憶體兩類資源)。它跟Linux Container沒有任何關係,僅僅是YARN提出的一個概念(從實現上看,可看做一個可序列化/反序列化的Java類)。
(2) Container由ApplicationMaster向ResourceManager申請的,由ResouceManager中的資源排程器非同步分配給ApplicationMaster;
(3) Container的執行是由ApplicationMaster向資源所在的NodeManager發起的,Container執行時需提供內部執行的任務命令(可以使任何命令,比如java、Python、C++程序啟動命令均可)以及該命令執行所需的環境變數和外部資源(比如詞典檔案、可執行檔案、jar包等)。
另外,一個應用程式所需的Container分為兩大類,如下:
(1) 執行ApplicationMaster的Container:這是由ResourceManager(向內部的資源排程器)申請和啟動的,使用者提交應用程式時,可指定唯一的ApplicationMaster所需的資源;
(2) 執行各類任務的Container:這是由ApplicationMaster向ResourceManager申請的,並由ApplicationMaster與NodeManager通訊以啟動之。
以上兩類Container可能在任意節點上,它們的位置通常而言是隨機的,即ApplicationMaster可能與它管理的任務執行在一個節點上。
一般而言,每個Container可用於執行一個任務。ApplicationMaster收到一個或多個Container後,再次將該Container進一步分配給內部的某個任務,一旦確定該任務後,ApplicationMaster需將該任務執行環境(包含執行命令、環境變數、依賴的外部檔案等)連同Container中的資源資訊封裝到ContainerLaunchContext物件中,進而與對應的NodeManager通訊,以啟動該任務。
來自:
http://dongxicheng.org/mapreduce-nextgen/understand-yarn-container-concept/
沒看懂?沒關係,略過就好,看完之後,會更容易理解
接下來,我們從上到下地介紹整個框架。
整個系統一個:ResourceManager (RM),負責整個系統的資源管理和分配。由2部分組成:Scheduler(排程器)、ApplicationsManager (ASM)
每個App一個:ApplicationMaster (App Mstr 或者 AM)
每個節點一個:NodeManager (NM)
放圖:
左邊2個Client,對應2種顏色,粉色、紫色,每個Client跑了一個App。(右邊2個App Mstr)
中間這個是RM,全域性唯一。
左邊有3個節點,3個NM,每個節點2個Container.從上到下:
- 第一個節點,有2個Container(一組資源),其中一個跑了一個App Mstr,但是箭頭可以看出,這2個Container並不屬於一個App
- 第二個節點,跟第一個節點剛好反過來
- 第三個節點,有2個粉色App的Container,沒有跑第三個App Mstr
再來看看圖裡面的箭頭:
- 每個NM都要向RM傳送本節點的情況(Node Status)
- 左邊2個Client分別向RM提交Job (Job Submission)
此時RM的ASM會起2個App Mstr,並在它們執行失敗時重啟它
- App Mstr向RM 傳送資源申請 (Resource Request)
RM只負責監控App Mstr,並不負責App Mstr內部任務的容錯,這是App Mstr的事兒,它會將一個Job分解為多個task,並與RM協調執行所需要的Container,將任務分配給Container。App Mstr將與NM一起安排、執行、監控這些Container
- 每個Container向App Mstr傳送 MapReduce Status (MapReduce 任務的狀態)
Okay,到這裡,你應該已經對整個叢集的工作方式,有了大概的瞭解。
接下來是一些細緻的介紹。
RM的Secheduler:
排程器,它會根據一些條件限制,比如capacities(容量), queues(佇列)(每個佇列分配一定的資源,最多執行一定數量的作業。佇列是一個挺重要的概念,我相信以後還會遇到),將系統的資源(Container)分配給 正在執行 的App。
Secheduler的工作是純粹的,它僅分配Container。不負責對App監控、跟蹤、失敗重啟等等
RM的ApplicationsManager:
ASM,它會做Secheduler不做的事情,負責管理整個系統中,所有的App,包括了:
- Job Submision
- 與Secheduler協商,拿出這個App的第一個Container來執行該App的App Mstr
- 在App Mstr掛掉時,重啟它
(但它也只面向App Mstr,不管App Mstr下面Container的情況)
App Mstr:
- 與Secheduler協商合適的Container
- 跟蹤他們的狀態
- 監控它們的程序
- 與NM通訊以啟動/停止Container
- (官網原話:ApplicationMaster has the responsibility of negotiating appropriate resource containers from the Scheduler, tracking their status and monitoring for progress.)
NM:
每個節點上的資源和工作管理員,它負責:
- 定時向RM彙報本節點上的Container使用情況、以及各個Container的執行情況
- 接受並處理來自AM的Container啟動/停止等各種請求
YARN 的幾個概念:
- ResourceManager
- ApplicationMaster
- NodeManager
1、ResourceManager
- 負責接受客戶端提交的 job,分配和排程資源
- 啟動 ApplicationMaster,判斷 job 所需資源
- 監控 ApplicationMaster,在其失敗的時候進行重啟
- 監控 NodeManager
2、ApplicationMaster
- 為 MapReduce 型別的程式申請資源,並分配任務
- 負責相關資料的切分
- 監控任務的執行及容錯
3、NodeManager
- 管理單個節點的資源,向 ResourceManager 進行彙報
- 接收並處理來自 ResourceManager 的命令
- 接收並處理來自 ApplicationMaster 的命令
MapReduce 程式設計模型
- 場景:輸入一個大型檔案,通過 split 將其分成多個檔案分片
- Map:每個檔案分片由單獨的機器進行處理,這就是 Map 方法
- Reduce:將各個機器的計算結果進行彙總,得到最終的結果,這就是 Reduce 方法
Map 任務處理
- 讀取輸入檔案的內容,解析成鍵值對,把檔案的每一行解析成鍵值對,每個鍵值對呼叫一次 map 函式;(Input)
- 寫自定義的邏輯,對輸入的鍵值對進行處理,轉換成新的鍵值對輸出;(Map)
- 對不同分割槽的資料,按照鍵(key)進行排序和分組,key 相同的值(value)放到一個集合中;(Sort -> Combine)
- 把輸出的鍵值對(此時只是中間結果)按照 key 的範圍進行分割槽處理;(Partition)
- 分組後的資料進行 reduce 處理。
Reduce 任務處理
- 對多個 map 任務的輸出,按照不同分割槽,通過網路 copy 到不同的 reduce 節點;
- 對多個 map 任務的輸出進行合併和排序,自定義 reduce 函式的邏輯,對輸入的鍵(key)和值(value)進行處理,轉換成新的鍵值對輸出;(Reduce)
- 把 reduce 的輸出儲存到檔案中。(Output)
MapReduce 的整個工作流程可以歸結為:
Input -> Map -> Sort -> Combine -> Partition -> Reduce -> Output
寫完以後,覺得Container的概念非常複雜,不過我覺得沒有必要糾結於一個點廢太多時間,日後自然會懂的。
希望對你有幫助。
轉自:知乎 大魚和葛堯的回答
連結:https://zhuanlan.zhihu.com/p/33198500
連結:https://zhuanlan.zhihu.com/p/31810137