1. 程式人生 > >YARN——Hadoop的叢集資源管理系統

YARN——Hadoop的叢集資源管理系統

YARN Architecture 筆記小結

     相對於昨天的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.從上到下:

  1. 第一個節點,有2個Container(一組資源),其中一個跑了一個App Mstr,但是箭頭可以看出,這2個Container並不屬於一個App
  2. 第二個節點,跟第一個節點剛好反過來
  3. 第三個節點,有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 任務處理

  1. 讀取輸入檔案的內容,解析成鍵值對,把檔案的每一行解析成鍵值對,每個鍵值對呼叫一次 map 函式;(Input)
  2. 寫自定義的邏輯,對輸入的鍵值對進行處理,轉換成新的鍵值對輸出;(Map)
  3. 對不同分割槽的資料,按照鍵(key)進行排序和分組,key 相同的值(value)放到一個集合中;(Sort -> Combine)
  4. 把輸出的鍵值對(此時只是中間結果)按照 key 的範圍進行分割槽處理;(Partition)
  5. 分組後的資料進行 reduce 處理。

Reduce 任務處理

  1. 對多個 map 任務的輸出,按照不同分割槽,通過網路 copy 到不同的 reduce 節點;
  2. 對多個 map 任務的輸出進行合併和排序,自定義 reduce 函式的邏輯,對輸入的鍵(key)和值(value)進行處理,轉換成新的鍵值對輸出;(Reduce)
  3. 把 reduce 的輸出儲存到檔案中。(Output)

MapReduce 的整個工作流程可以歸結為:

Input -> Map -> Sort -> Combine -> Partition -> Reduce -> Output


 

   寫完以後,覺得Container的概念非常複雜,不過我覺得沒有必要糾結於一個點廢太多時間,日後自然會懂的。

   希望對你有幫助。

 

轉自:知乎 大魚和葛堯的回答
連結:https://zhuanlan.zhihu.com/p/33198500
連結:https://zhuanlan.zhihu.com/p/31810137