學習筆記 | YARN 統一資源管理與調度 YARN

  • 統一資源管理與調度系統的設計;
  • 統一資源管理與調度系統的實現——YARN。

01 統一資源管理與調度系統的設計

YARN 的全稱是 Yet Another Resource Negotiator,直譯過來是:另一種資源協調者,但是它的標準名稱是統一資源管理與調度系統,這個名稱一共包含 3 個詞:統一、資源管理、調度。

來看看第 1 個詞語:統一
  • 對於大數據計算框架來說,統一指的是資源並不會與計算框架綁定,對於所有計算框架來說,所有資源都是無差別的,也就是說這個系統可以支持多種計算框架,但這是狹義的統一。而廣義上的統一,是指資源針對所有應用來說都是無差別的,包括長應用、短應用、數據庫、後端服務,等等。
來看看第 2 個詞語:資源管理
  • 對於資源管理來說,最重要的是瞭解對於這個系統,什麼纔是它的資源,或者說是資源的維度,常見的有 CPU、內存、磁盤、網絡帶寬等,對於 YARN 來說,資源的維度有兩個:CPU 和內存。這也是大數據計算框架最需要的資源。
最後一個詞語:調度

說到調度,就沒那麼簡單了。目前的宏觀調度機制一共有 3 種:集中式調度器(Monolithic Scheduler)、雙層調度器(Two-Level Scheduler)和狀態共享調度器(Shared-State Scheduler),我們一個一個來說:

集中式調度器(Monolithic Scheduler)

集中式調度器全局只有一箇中央調度器,計算框架的資源申請全部提交給中央調度器來滿足,所有的調度邏輯都由中央調度器來實現。所以調度系統在高併發作業的情況下,容易出現性能瓶頸,如下圖所示,紅色的方塊是集羣資源信息,調度器擁有全部的集羣資源信息(藍色方塊),集中式調度器的實現就是 Hadoop MapReduce 的 JobTracker,實際的資源利用率只有 70% 左右,甚至更低。Jobtracker 有多不受歡迎呢,從 Hadoop 2.0 中 YARN 的名字就可以看出:另一種資源協調器,你細品。這種在多個計算作業同時申請資源的時候,中央調度器實際上是沒有併發的,完全是順序執行。

雙層調度器(Two-Level Scheduler)

雙層調度器將整個調度工作劃分爲兩層:中央調度器和框架調度器

  • 中央調度器管理集羣中所有資源的狀態,它擁有集羣所有的資源信息,按照一定策略(例如 FIFO、Fair、Capacity、Dominant Resource Fair)將資源粗粒度地分配給框架調度器,各個框架調度器收到資源後再根據應用申請細粒度將資源分配給容器執行具體的計算任務。在這種雙層架構中,每個框架調度器看不到整個集羣的資源,只能看到中央調度器給自己的資源,如圖所示:
  • 紫色和綠色的圓圈所在的方框是框架調度器,可以看到中央調度器把全部資源的兩個子集分別交給了兩個框架調度器,注意看,這兩個子集是沒有重合的,這種機制類似於併發中的悲觀併發。
狀態共享調度器

狀態共享調度器是由 Google 的 Omega 調度系統所提出的一種新範型,與谷歌的其他論文不同,Omega 這篇論文對詳細設計語焉不詳,只簡單說了下大體原理和與其他調度範型的比較。

狀態共享式調度大大弱化了中央調度器,它只需保存一份集羣使用信息,就是圖中間的藍色方塊,取而代之的是各個框架調度器,每個調度器都能獲取集羣的全部信息,並採用樂觀鎖控制併發。Omega 與雙層調度器的不同在於嚴重弱化了中央調度器,每個框架內部會不斷地從主調度器更新集羣信息並保存一份,而框架對資源的申請則會在該份信息上進行,一旦框架做出決策,就會將該信息同步到主調度。資源競爭過程是通過事務進行的,從而保證了操作的原子性。由於決策是在自己的私有數據上做出的,並通過原子事務提交,系統保證只有一個勝出者,這是一種類似於 MVCC 的樂觀併發機制,可以增加系統的整體併發性能,但是調度公平性有所不足。

02 統一資源管理與調度系統的實現:YARN

簡單來看看 YARN 的架構圖,YARN 的架構是典型的主從架構,主節點是 ResourceManger,也是我們前面說的主調度器,所有的資源的空閒和使用情況都由 ResourceManager 管理。ResourceManager 也負責監控任務的執行,從節點是 NodeManager,主要負責管理 Container 生命週期,監控資源使用情況等 ,Container 是 YARN 的資源表示模型,Task 是計算框架的計算任務,會運行在 Container 中,ApplicationMaster 可以暫時認爲是二級調度器,比較特殊的是它同樣運行在 Container 中。
在這裏插入圖片描述
我們來看看 YARN 啓動一個 MapReduce 作業的流程,如圖所示:

在這裏插入圖片描述
第 1 步:客戶端向 ResourceManager 提交自己的應用,這裏的應用就是指 MapReduce 作業。
第 2 步:ResourceManager 向 NodeManager 發出指令,爲該應用啓動第一個 Container,並在其中啓動 ApplicationMaster。
第 3 步:ApplicationMaster 向 ResourceManager 註冊。
第 4 步:ApplicationMaster 採用輪詢的方式向 ResourceManager 的 YARN Scheduler 申領資源。
第 5 步:當 ApplicationMaster 申領到資源後(其實是獲取到了空閒節點的信息),便會與對應 NodeManager 通信,請求啓動計算任務。
第 6 步:NodeManager 會根據資源量大小、所需的運行環境,在 Container 中啓動任務。
第 7 步:各個任務向 ApplicationMaster 彙報自己的狀態和進度,以便讓 ApplicationMaster 掌握各個任務的執行情況。
第 8 步:應用程序運行完成後,ApplicationMaster 向 ResourceManager 註銷並關閉自己。

現在絕大多數資料與網上的文章都將 YARN 歸爲雙層調度,這個說法準確嗎?ApplicationMaster 與前面講的框架調度器(二級調度器)很像,回答這個問題有點複雜,涉及到對調度範式得深刻理解。
首先可以看到最下面的一個單詞是 offers,還有藍色和綠色的箭頭方向,這說明什麼問題呢?主調度器擁有整個集羣資源的的狀態,通過 Offer(主動提供,而不是被動請求)方式通知每個二級調度器有哪些可用的資源。每個二級調度器根據自己的需求決定是否佔有提供的資源,決定佔有後,該分區內的資源由二級調度器全權負責。

這句話怎麼理解呢?如果你將集羣資源看成一個整體,那麼這種方式可以認爲是預先將整個資源進行動態分區。作業則向二級調度器申請資源,可以多個作業共用一個二級調度器,此外,每個二級調度器和主調器都可以配置不同的調度算法模塊。那麼從這個點上來說,YARN 離真正的雙層調度還有些差距,但和前面講的 JobTracker 相比,已經是很大的進步了,並顯著提升了調度性能,某度程度上,也可以說是一種雙層調度,或者更準確地說,兩次調度。所以如果在面試中,遇到這個問題,除非你和麪試官都真的完全理解了 YARN 和雙層調度的距離,否則還是回答 YARN 是雙層調度吧。

由於 Spark 與 MapReduce 相比,是一種 DAG 計算框架,包含一系列的計算任務,比較特殊,所以 Spark 自己實現了一個集中式調度器 Driver,用來調用作業內部的計算任務。申請到的資源可以看成是申請分區資源,在該分區內,所有資源由 Driver 全權使用,以客戶端方式提交的 Spark on Yarn 這種方式可以看成是 Driver 首先在資源管理和調度系統中註冊爲框架調度器(二級調度器),接收到需要得資源後,再開始進行作業調度。那麼這種方式可以認爲是一種曲線救國的雙層調度實現方式,這個我們後面會講到。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章