程式扎記: [ Big Data 研究 ] 07 建置 YARN 分散式運算系統 - YARN 運作原理

標籤

2015年10月7日 星期三

[ Big Data 研究 ] 07 建置 YARN 分散式運算系統 - YARN 運作原理

Introduction 
Hadoop 具備資料儲存與運算, 這兩大基本系統架構, 除了前一章介紹的 HDFS 分散式檔案系統外, 另一個就是分散式運算系統. 第二代 Hadoop 基本預設為 YARN, 在目前 Hadoop 的架構上只要是使用 "MapReduce" 的運算模式, 就是由 YARN 來負責各項運算資源的分配與執行 (YARN 不僅用在 MapReduce 運算中), 然而 YARN 並不是單一的執行程序, 而是一套運算資源 (CPU, Memory) 管理, 分配與運算的系統, 由許多不同的 "角色", 以最佳的方式來完成整個資源的分配與運算的動作. 

YARN 運作原理 
相對於 Hadoop 的 HDFS 分散式檔案系統, YARN 的運作就顯得複雜得多, 而複雜的原因在於 YARN 將整個運作 (運算) 的過程細分成許多步驟, 每個步驟都由不同的 "角色" 來分擔不同的任務, 事實上每個角色都是 YARN 的基本運算單元, 利用角色分工的方式, 就可以有效率的進行資訊傳遞與資料運算的工作. 那麼 YARN 到底存在那些角色? 這些角色的功用分別為何? 角色彼此之間又是如何傳遞資訊與任務指派? 

其實整個 YARN 的運作是由四大角色所組成, 分別為 "ResourceManager", "Application Master" (App Mstr), "NodeManager" 與 "Container". 每個角色說穿了其實都是一個完整的 Java 程式, 且在 YARN 運作的過程中, 都具有其獨特的功能, 各司其職已完成指派工作. 

在上述角色中實際負責執行運算功能的角色為 Container, 其在執行運算過程時, 其本身存在一個標準與規範. 所有要在 Container 內執行的程式都要依循 Container 的標準與規範. 而此標準與規範則取決於這個 Container 所擁有的運算資源, 如 CPU 的效能與記憶體的多寡, 而每個 Container 可以依照不同的指派來執行不同的運算需求. YARN 的完整運作流程如下圖: 




























YARN 的運作流程 
依照上圖的流程, 整個 YARN 執行過程步驟大致如下: 
步驟一: 

Client 端要執行的程式 (*.jar), 需要先從 Client 上傳到 HDFS, 再由 YARN 從 HDFS 那取出要執行的程式.

步驟二: 
Client 向 ResourceManager 提出任務需求, ResourceManager 則會替該應用程式 (任務需求) 分配一個 Container, 並與此 Container 所在的 NodeManager 通訊, 要求他在這個 Container 中啟動管理應用程序的 Application Master (App Master), 接著 Client 端會告訴此 App Master 要執行的程式以及所需要資料的位置.

步驟三: 
App Master 回報 Resource Manager 已經準備完成, 可以承接運算需求.

步驟四: 
App Master 會由程式與資料計算總共需要多少個 Container, 然後回報給 ResourceManager, 並向 ResourceManager 要求所需要的運算資源.

步驟五: 
ResourceManager 會通知並準備好需要的 Container(s)

步驟六: 
Container 準備好就會開始執行程式, 並回報結果 (不管成功與否), 給 App Master.

步驟七: 
Client 會詢問 App Master 程式執行的進度與狀況.

步驟八: 
App Master 回報給 ResourceManager 整個專案的執行結果.

以上就是整個 YARN 大致的執行過程, 各個角色透過溝通與協調分工, 就能夠善用所有可運用的運算資源, 以最快的速度與能力來完成 Client 端的任務需求. 話雖如此這些角色分別都是存在那些機器上面呢? dn01/dn02 運算主機除了作為 DataNode 之外, 還存在三種身分, 分別是 "NodeManager", "MRAppMaster" (MapReduce 的 Application Master) 以及 "YarnChild" (執行 MapReduce 程式的 Container), 在 dn01 或 dn02 運算主機輸入以下指令就可以看到所有的角色: 
$ jps
461 DataNode
562 NodeManager
1075 Jps
964 MRAppMaster
1061 YarnChild

在實際任務執行上, 則會依據任務的指派有角色改變的情況發生. 

MapReduce 的軟體架構 
前面提到 YARN 是用來進行運算資源的分配與管理, 而從 Hadoop 2.x 版本開始, YARN 已經可以支援不同的運算模式的資料處理, 像是 Streaming (串流), Graph (關聯資料) 以及 Hadoop 1.x 版本預設的運算模式 "MapReduce". 

MapReduce 的運算模式其實分為兩個部分: 一部分為 "Map"; 另一部分為 "Reduce". 兩者都是可以獨立運作的程式, 換句話說兩者都是可以獨立運作的 "Container". 不過 Map 與 Reduce 必須互相搭配才能完成整個 MapReduce 的運算, 其結果才會完整. 一個完整的 MapReduce 運算可以再細分為許多不同的處理程序: 



































上面流程可以分為六個處理步驟: 
步驟一: "Input" 
決定想要運算的資料

步驟二: "Splitting" 
將輸入資料以行為單位, 切割成一個個基本運算文字單位.

步驟三: "Mapping" 
將分割好的資料進行計數.

步驟四: "Shuffing" 
依照每個基本運算文字類別, 分配到相對應的 NodeManager 進行彙整.

步驟五: "Reducing" 
將 Shuffling 過的資料進行最後的彙整, 並統計總數量.

步驟六: "Final Result" 
匯集並整合所有 Reducing 過後的資料, 而這也就是 MapReduce 之後的結果.

Timeline Server 
除了前面所述的四大角色外, 在所有 YARN 角色當中, 其實還有一個角色 "Timeline Server". 不過這一個角色相對特別, 因為它實際並不擔負任何與資源分配或是運算執行相關的工作. 這個角色是用來取代 Hadoop 1.x 版本中的 JobHistory Server, 並記錄 MapReduce 的 Log 資訊, 但是 Timeline Server 目前不僅記錄 MapReduce 的 Log, 另外也記錄像是 Streaming (串流), Graph (關聯資料) 的 Log 資訊. 因此 Hadoop 發展出一個通用的 Log Server 就是 "Timeline Server".

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!