深入理解 Taier:MR on Yarn 的實現原理
我們今天常說的 ,它的理論基礎來自於2003年 Google 發表的三篇論文,《The Google File System》、《MapReduce: Simplified Data Processing on Large Clusters》、《Bigtable: A Distributed Storage System for Structured Data》。這三篇論文分別對應後來出現的 HDFS,MapReduce, HBase。
在大資料的發展歷史上,還有一個名字是無論如何都繞不開的,那就是 Doug Cutting。Doug是 Apache Lucene、Nutch、Hadoop、Avro 專案的創始人,2006 年 Docu Cutting 開源了 ,名字取自於他兒子的玩具小象 Hadoop。
那麼就從 Hadoop 起,我們開始本文的分享。
Taier & Yarn
Hadoop
新生事物的成長往往是螺旋上升的,Hadoop 也是如此。Hadoop 1.0 是指 MapReduce + HDFS,其中 是一個離線處理框架,由程式設計模型(新舊API)、執行時環境(JobTracker 和 TaskTracker)和 (MapTask和ReduceTask)三部分組成。早期的 MapReduce 非常臃腫,有著很明顯的缺點,JobTracker 有單點故障問題、框架設計只能執行 MapReduce 任務,不能跑 Storm,Flink 等計算框架的任務。
之後迎來的 Hadoop 2.0 是指 MapReduce + HDFS + Yarn,其中 YARN 是一個 ,負責叢集資源管理和排程, MapReduce 則是執行在 YARN 上的離線處理框架。Hadoop 2.0 很好地解決了單點問題,它將 JobTracker 中的資源管理和作業控制分開,分別由 負責所有應用程式的資源分配,ApplicationMaster 負責管理一個應用程式。並且解決了擴充套件問題,包括針對 Hadoop 1.0 中的 MapReduce 在擴充套件性和多框架支援等方面的不足。
MapReduce 2.0
MapReduce 1.0的工作機制中,角色主要包括客戶端,Jobtracker,Tasktracker。 主要是協調作業的執行,而 是負責執行作業劃分之後的任務。網上關於 MR 1.0 的內容很多,這裡就不再過多贅述,流程圖如下:
到了 MapReduce 2.0,核心思想則是將 MR 1.0 中 JobTracker 的資源管理和任務排程兩個功能分開,分別由 ResourceManager 和 ApplicationMaster 程式實現。
MR 2.0 的工作流程主要分為以下6個執行過程(請將圖片和文字對照起來看):
一、作業的提交
1)客戶端向 ResourceManager 請求一個新的作業ID,ResourceManager 收到後,回應一個 ,見第2步
2)計算作業的輸入分片,將執行作業所需要的資源(包括jar檔案、配置檔案和計算得到的輸入分片)複製到一個(HDFS),見第3步
3)告知 ResourceManager 作業準備執行,並且呼叫 submitApplication() 提交作業,見第4步
二、作業的初始化
4) ResourceManager收到對其 submitApplication() 方法的呼叫後,會把此呼叫放入一個內部佇列中,交由作業排程器進行排程,並對其初始化,然後為該其分配一個 contain 容器,見第5步
5)並與對應的 NodeManager 通訊,見第5a步;要求它在 Contain 中啟動 ApplicationMaster ,見第5b步
6) ApplicationMaster 啟動後,會對作業進行初始化,並保持作業的追蹤,見第6步
7) ApplicationMaster 從 HDFS 中 共享資源,接受客戶端計算的輸入分片為每個分片,見第7步
三、任務的分配
8) ApplicationMaster 向 ResourceManager 註冊,這樣就可以直接透過 RM 檢視應用的執行狀態,然後為所有的 map 和 reduce 任務獲取資源,見第8步
四、任務的執行
9) ApplicationMaster 申請到資源後,與 NodeManager 進行互動,要求它在 中啟動執行任務,見第9a、9b步
五、進度和狀態的更新
10)各個任務透過 RPC 協議 umbilical 介面向 ApplicationMaster 彙報自己的狀態和進度,方便 ApplicationMaster 隨時掌握各個任務的執行狀態,使用者也可以向 ApplicationMaster 查詢執行狀態
六、作業的完成
11)應用完成後,ApplicationMaster 向 ResourceManager 登出並關閉自己
手寫一個 Yarn 程式
如果想要將一個新的應用程式執行在 YARN 之上,通常需要編寫兩個元件:客戶端和 ApplicationMaster。
· 客戶端編寫需要注意:客戶端通常只需與 ResourceManager 互動,期間涉及到多個資料結構和一個 RPC 協議。
· ApplicationMaster 編寫需要注意:ApplicationMaster 需要與 ResoureManager 和 NodeManager 互動,以申請資源和啟動 Container,期間涉及到多個資料結構和兩個 。
手寫一個 YARN Application 程式對理解 YARN 的執行原理非常有幫助,熟悉 Spark 、Flink 計算元件的同學也可以參考 Spark on Yarn、Flink on Yarn 的原始碼。
Taier&Yarn
洋洋灑灑,回過頭來,現在來給大家介紹一下 Taier 和 Yarn 之間的關係。
Taier 作為 ,是數棧資料中臺整體架構的重要樞紐,負責排程日常龐大的任務量。它旨在降低ETL開發成本,提高大資料平臺穩定性,讓大資料開發人員可以在 Taier 直接進行業務邏輯的開發,而不用關心任務錯綜複雜的依賴關係與底層的大資料平臺的架構實現,將工作的重心更多地聚焦在業務之中。
為了更好地實現讓資料開發人員關注業務的目標,Taier 主要在控制檯中展示了 Hadoop Yarn的相關資訊。分為以下3點:Yarn 配置管理、Yarn 資源管理、任務 on Yarn 的相關配置。
下面為大家展示一下 Taier 中 Yarn 相關的頁面:
實現原理
前情提要全部講完,下面為大家重點介紹下 Taier 怎麼實現 MR on Yarn 的計算。
Taier 目前支援 ,支援在 Yarn 上執行的任務有 python、shell、資料同步、實時採集、Flink Jar、Flink SQL、Spark SQL 和 Hadoop MR 等等。
實現原理
以 MR on Yarn 任務為例,其實現原理主要有2個關鍵步驟:
· 組裝任務執行時的相關資訊生成 pluginInfo,資訊包含任務相關配置、YARN 配置、HDFS 配置和公共配置。
· 根據 pluginInfo 例項化相應的任務提交客戶端,客戶端負責向 YARN 提交任務,實現了 Taier 與計算叢集的解耦、保證節點無侵入。
下圖是目前已經在 Taier 上執行的 Flink 任務的一些引數,包括 groupName、jobID 等:
執行原理
以 MR on Yarn 任務為例,其執行原理可以分為以下3個階段:
● 準備階段
· 對普通的 Hadoop MR 任務進行改造,修改 MR 程式碼的 Main 方法
· 編譯修改後的 Hadoop MR 任務,並透過 將 Jar 進行上傳,目標選擇 HDFS
· 配置 Haddoop MR 任務的任務引數
● 執行階段
· Taier 的 主要負責任務提交相關工作,其中 hadoop 外掛會負責 MR 任務的相關處理
· 例項化 HadoopClient,並下載準備階段上傳的 MR 任務對應的 Jar(注意這裡是一個任務的生命週期,為了保障任務的無狀態,所以每次執行都會重新下載一次)
· 透過 MapReduceTemplate ,載入 Jar 並構建 MR 任務的類載入器
· 透過類載入器實獲取 Class 類物件,並呼叫類物件的 Main 方法,傳入 Configuration、args 等引數
· 返回 JobId
● 運維階段
· 處理 JobId 並轉化為 ApplicationId
· 例項化 YarnClient,獲取 MR on Yarn 的相關資訊,包括執行狀態、日誌、停止 Application
Taier 中的 Hadoop 外掛
Hadoop MR 的任務在 Taier 中的實現是基於 ,在裡面實現了相關的類,其中比較主要的包括:
· HadoopClient: 實現任務提交執行的相關介面(init、judgeSlots、processSubmitJobWithType、beforeSubmitFunc、afterSubmitFunc、getJobStatus、getJobLog、cancelJob)
· MapReduceTemplate:封裝 MR 任務及其重要引數、方法,例項化 PackagedProgram
· PackagedProgram:MR 任務提交前的處理實現
這一部分相關的程式碼可以在 PR 中的上下文看到,也可以下載 Taier 外掛看到關鍵類所做的事件,如何相互配合實現 MR 任務往 Yarn 上進行提交。
相關PR:
案例演示
案例演示的部分,大家直接觀看影片,會得到最直觀清楚的講解,本文就不再進行贅述。
影片連結:
影片課程&PPT獲取
影片課程:
課件獲取:
關注公眾號 “數棧研習社” ,後臺私信 “Taier” 獲得直播課件
《資料治理行業實踐白皮書》下載地址:
想了解更多有關袋鼠雲大資料產品、行業解決方案、客戶案例的朋友,瀏覽袋鼠雲官網:https://www.dtstack.com/?src=szitpub
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69995740/viewspace-2939732/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 深入理解ReentrantLock的實現原理ReentrantLock
- 深入理解Vue的computed實現原理及其實現方式Vue
- 深入理解Vue的watch實現原理及其實現方式Vue
- 解析HetuEngine實現On Yarn原理Yarn
- Hadoop Yarn框架原理解析HadoopYarn框架
- 深入理解React:懶載入(lazy)實現原理React
- 深入理解Java中的底層阻塞原理及實現Java
- 深入理解多執行緒(一)——Synchronized的實現原理執行緒synchronized
- 深入理解Java的垃圾回收機制(GC)實現原理JavaGC
- 【Flink】深入理解Flink-On-Yarn模式Yarn模式
- AOP的實現深入理解
- 深入理解MySQL中事務隔離級別的實現原理MySql
- 深入理解DES演算法:原理、實現與應用演算法
- 理解 Block 實現原理BloC
- Hadoop技術內幕:深入解析YARN架構設計與實現原理 附下載地址HadoopYarn架構
- Js實現任意位置縮放圖片,深入理解背後原理JS
- 深入 Go 的 Map 使用和實現原理Go
- 深入理解 ProtoBuf 原理與工程實踐(概述)
- 深入解析 ResNet:實現與原理
- Babel 外掛原理的理解與深入Babel
- 深入理解 Spring 的事務原理Spring
- 深入理解 Python 虛擬機器:整型(int)的實現原理及原始碼剖析Python虛擬機原始碼
- 深入理解 Python 虛擬機器:列表(list)的實現原理及原始碼剖析Python虛擬機原始碼
- 深入理解事件機制的實現事件
- 理解https中的安全及其實現原理HTTP
- 快速理解容器技術的實現原理
- 深入理解 python 虛擬機器:位元組碼教程(3)——深入剖析迴圈實現原理Python虛擬機
- 夯實Java基礎系列8:深入理解Java內部類及其實現原理Java
- 夯實Java基礎系列18:深入理解Java內部類及其實現原理Java
- iOS底層原理總結篇-- 深入理解 KVC\KVO 實現機制iOS
- 深入理解TensorFlow架構設計與實現原理 3 :基礎概念架構
- 深入理解HTTPS工作原理HTTP
- 深入理解 MySQL 底層實現MySql
- Android SharedPreferences 實現原理解析Android
- 理解比特幣(4)——實現原理比特幣
- 併發——深入分析ThreadLocal的實現原理thread
- mr原理簡單分析
- 深入原始碼解析 tapable 實現原理原始碼