深刻淺出Hadoop YARN

一. Hadoop Yarn 是什麼算法

在古老的 Hadoop1.0 中,MapReduce 的 JobTracker 負責了太多的工做,包括資源調度,管理衆多的 TaskTracker 等工做。這天然是不合理的,因而 Hadoop 在 1.0 到 2.0 的升級過程當中,便將 JobTracker 的資源調度工做獨立了出來,而這一改動,直接讓 Hadoop 成爲大數據中最穩固的那一塊基石,而這個獨立出來的資源管理框架,就是 Yarn 。網絡

在詳細介紹 Yarn 以前,咱們先簡單聊聊 Yarn ,Yarn 的全稱是 Yet Another Resource Negotiator,意思是「另外一種資源調度器」,這種命名和「有間客棧」這種可謂是殊途同歸之妙。這裏多說一句,之前 Java 有一個項目編譯工具,叫作 Ant,他的命名也是相似的,叫作 「Another Neat Tool」的縮寫,翻譯過來是」另外一種整理工具「。架構

既然都叫作資源調度器了,那麼天然,它的功能也是負責資源管理和調度的,接下來,咱們就深刻到 Yarn 這個東西內部一探究竟吧。框架

二. Yarn 架構分佈式

深刻淺出Hadoop YARN

咱們主要圍繞上面這張圖展開,不過在介紹圖中內容時,須要先了解 Yarn 中的 Container 的概念,而後會介紹圖中一個個組件,最後看看提交一個程序的流程。工具

2.1 Containeroop

容器(Container)這個東西是 Yarn 對資源作的一層抽象。就像咱們平時開發過程當中,常常須要對底層一些東西進行封裝,只提供給上層一個調用接口同樣,Yarn 對資源的管理也是用到了這種思想。性能

深刻淺出Hadoop YARN

如上所示,Yarn 將CPU核數,內存這些計算資源都封裝成爲一個個的容器(Container)。須要注意兩點:學習

  • 容器由 NodeManager 啓動和管理,並被它所監控。
  • 容器被 ResourceManager 進行調度。

NodeManager 和 ResourceManager 這兩個組件會在下面講到。大數據

2.2 三個主要組件

再看最上面的圖,咱們能直觀發現的兩個主要的組件是 ResourceManager 和 NodeManager ,但其實還有一個 ApplicationMaster 在圖中沒有直觀顯示。咱們分別來看這三個組件。

ResourceManager

咱們先來講說上圖中最中央的那個 ResourceManager(RM)。從名字上咱們就能知道這個組件是負責資源管理的,整個系統有且只有一個 RM ,來負責資源的調度。它也包含了兩個主要的組件:定時調用器(Scheduler)以及應用管理器(ApplicationManager)。

定時調度器(Scheduler):從本質上來講,定時調度器就是一種策略,或者說一種算法。當 Client 提交一個任務的時候,它會根據所須要的資源以及當前集羣的資源情況進行分配。注意,它只負責嚮應用程序分配資源,並不作監控以及應用程序的狀態跟蹤。

應用管理器(ApplicationManager):一樣,聽名字就能大概知道它是幹嗎的。應用管理器就是負責管理 Client 用戶提交的應用。上面不是說到定時調度器(Scheduler)不對用戶提交的程序監控嘛,其實啊,監控應用的工做正是由應用管理器(ApplicationManager)完成的。

ApplicationMaster

每當 Client 提交一個 Application 時候,就會新建一個 ApplicationMaster 。由這個 ApplicationMaster 去與 ResourceManager 申請容器資源,得到資源後會將要運行的程序發送到容器上啓動,而後進行分佈式計算。

這裏可能有些難以理解,爲何是把運行程序發送到容器上去運行?若是以傳統的思路來看,是程序運行着不動,而後數據進進出出不停流轉。但當數據量大的時候就無法這麼玩了,由於海量數據移動成本太大,時間太長。可是中國有一句老話山不過來,我就過去。大數據分佈式計算就是這種思想,既然大數據難以移動,那我就把容易移動的應用程序發佈到各個節點進行計算唄,這就是大數據分佈式計算的思路。

NodeManager

NodeManager 是 ResourceManager 在每臺機器的上代理,負責容器的管理,並監控他們的資源使用狀況(cpu,內存,磁盤及網絡等),以及向 ResourceManager/Scheduler 提供這些資源使用報告。

三. 提交一個 Application 到 Yarn 的流程

深刻淺出Hadoop YARN

這張圖簡單地標明瞭提交一個程序所經歷的流程,接下來咱們來具體說說每一步的過程。

Client 向 Yarn 提交 Application,這裏咱們假設是一個 MapReduce 做業。

ResourceManager 向 NodeManager 通訊,爲該 Application 分配第一個容器。並在這個容器中運行這個應用程序對應的 ApplicationMaster。

ApplicationMaster 啓動之後,對 做業(也就是 Application) 進行拆分,拆分 task 出來,這些 task 能夠運行在一個或多個容器中。而後向 ResourceManager 申請要運行程序的容器,並定時向 ResourceManager 發送心跳。

申請到容器後,ApplicationMaster 會去和容器對應的 NodeManager 通訊,然後將做業分發到對應的 NodeManager 中的容器去運行,這裏會將拆分後的 MapReduce 進行分發,對應容器中運行的多是 Map 任務,也多是 Reduce 任務。

容器中運行的任務會向 ApplicationMaster 發送心跳,彙報自身狀況。當程序運行完成後, ApplicationMaster 再向 ResourceManager 註銷並釋放容器資源。

以上就是一個做業的大致運行流程。

爲何會有 Yarn ?

上面說了這麼多,最後咱們來聊聊爲何會有 Yarn 吧。

直接的緣由呢,就是由於 Hadoop1.0 中架構的缺陷,在 MapReduce 中,jobTracker 擔負起了太多的責任了,接收任務是它,資源調度是它,監控 TaskTracker 運行狀況仍是它。這樣實現的好處是比較簡單,但相對的,就容易出現一些問題,好比常見的單點故障問題。

要解決這些問題,只能將 jobTracker 進行拆分,將其中部分功能拆解出來。彼時業內已經有了一部分的資源管理框架,好比 mesos,因而照着這個思路,就開發出了 Yarn。這裏多說個冷知識,其實 Spark 早期是爲了推廣 mesos 而產生的,這也是它名字的由來,不事後來反正是 Spark 火起來了。。。

閒話很少說,其實 Hadoop 能有今天這個地位,Yarn 能夠說是功不可沒。由於有了 Yarn ,更多計算框架能夠接入到 Hdfs 中,而不僅僅是 MapReduce,到如今咱們都知道,MapReduce 早已經被 Spark 等計算框架趕超,而 Hdfs 卻依然屹立不倒。究其緣由,正式由於 Yarn 的包容,使得其餘計算框架能專一於計算性能的提高。Hdfs 可能不是最優秀的大數據存儲系統,但倒是應用最普遍的大數據存儲系統,Yarn 功不可沒。

感興趣的能夠本身來個人Java架構羣,能夠獲取免費的學習資料,羣號:855801563 對Java技術,架構技術感興趣的同窗,歡迎加羣,一塊兒學習,相互討論。

相關文章
相關標籤/搜索