Hadoop生態系統之Yarn

Apache YARN(Yet Another Resource Negotiator) 是Hadoop的集羣資源管理系統。YARN被引入Hadoop2最初是爲了改善MapReduce的實現,但它具有足夠的通性,同樣可以支持其他的分佈式計算模式。

YARN在Hadoop2.0中與其它組件關係:

Yarn_lo_thumb1

Yarn職責說明:

      通用的統一的資源管理系統,同時運行長應用程序和短應用程序

     長應用: 永不停止運行,如 service,spark,storm ,http server等

     短應用: 短時間內會結束的程序,如map job ,spark job

 

YARN的架構


yarn_architecture_thumb1

ResourceManager : 管理集羣上資源

NodeManager : 運行在所有幾點上且能夠啓動和監控容器(container)

Container: 用於執行特定應用程序的進程,每個容器都有有限的資源限制(CPU,內存)

ApplicationMaster: 負責調度協調

 

1. 應用啓動流程

《hadoop權威指南》中在Yarn中運行一個應用程序的過程:

20180429120742719_thumb1

爲了在YARN上運行一個應用,首先客戶端聯繫資源管理器,要求它運行一個application master進程(步驟1)。

然後資源管理器找到一個能夠在容器中啓動application master的節點管理器(步驟2a和2b)。準確地說application master一旦運行起來後能做些什麼依賴於應用本身。有可能是在所處的容器中簡單地運行一個計算,並將結果返回給客戶端,或是向資源管理器請求更多的容器(步驟3),以用於運行一個分佈式計算(步驟4a和4b)。後者是MapReduce Yarn應用所做的事情。

下面這張圖更詳細的描述了應用啓動的過程:

QQ20181014113436_thumb1

 

2.應用生命週期

YARN應用的生命期差異性很大:有幾秒的短期應用,也有連續運行幾天甚至幾個月的長期應用。與其關注應用運行多長時間不如按照應用到用戶運行的作業之間的映射關係對應用進行分類更有意義。最簡單的模型是一個用戶作業對應一個應用,這也是MapReduce採取的方式。

第二種模型是,作業的每個工作流或每個用戶對話對應一個應用。這種方法要比第一種情況效率更高,因爲容器可以在作業之間重用,並且有可能緩存作業之間的中間數據。Spark採取的是這種模型。

第三種模型是,多個用戶共享一個長期運行的應用。這種應用通常是作爲一種協調者的角色在運行。例如Apache Slider有一個長期運行的application master,主要用於啓動集羣上的其他應用。Impala也使用這種模型提供了一個代理應用,Impala守護進程通過該代理請求集羣資源。由於避免了啓動新application master帶來的開銷,一個總是開啓的application master意味着用戶將獲得非常低延遲的查詢響應。

 

3. Yarn中的調度

理想情況下,我們應用對Yarn資源的請求應該立刻得到滿足,但現實情況資源往往是有限的,特別是在一個很繁忙的集羣,一個應用資源的請求經常需要等待一段時間才能的到相應的資源。在Yarn中,負責給應用分配資源的就是Scheduler。其實調度本身就是一個難題,很難找到一個完美的策略可以解決所有的應用場景。爲此,Yarn提供了多種調度器和可配置的策略供我們選擇。

調度器的選擇

在Yarn中有三種調度器可以選擇:FIFO Scheduler ,Capacity Scheduler,FairS cheduler。

FIFO Scheduler把應用按提交的順序排成一個隊列,這是一個先進先出隊列,在進行資源分配的時候,先給隊列中最頭上的應用進行分配資源,待最頭上的應用需求滿足後再給下一個分配,以此類推。

FIFO Scheduler是最簡單也是最容易理解的調度器,也不需要任何配置,但它並不適用於共享集羣。大的應用可能會佔用所有集羣資源,這就導致其它應用被阻塞。在共享集羣中,更適合採用Capacity Scheduler或Fair Scheduler,這兩個調度器都允許大任務和小任務在提交的同時獲得一定的系統資源。

下面“Yarn調度器對比圖”展示了這幾個調度器的區別,從圖中可以看出,在FIFO 調度器中,小任務會被大任務阻塞。

而對於Capacity調度器,有一個專門的隊列用來運行小任務,但是爲小任務專門設置一個隊列會預先佔用一定的集羣資源,這就導致大任務的執行時間會落後於使用FIFO調度器時的時間。

在Fair調度器中,我們不需要預先佔用一定的系統資源,Fair調度器會爲所有運行的job動態的調整系統資源。如下圖所示,當第一個大job提交時,只有這一個job在運行,此時它獲得了所有集羣資源;當第二個小任務提交後,Fair調度器會分配一半資源給這個小任務,讓這兩個任務公平的共享集羣資源。

需要注意的是,在下圖Fair調度器中,從第二個任務提交到獲得資源會有一定的延遲,因爲它需要等待第一個任務釋放佔用的Container。小任務執行完成之後也會釋放自己佔用的資源,大任務又獲得了全部的系統資源。最終的效果就是Fair調度器即得到了高的資源利用率又能保證小任務及時完成。

 

參考:

官方文檔: http://hadoop.apache.org/docs/r2.6.4/hadoop-yarn/hadoop-yarn-site/YARN.html

hadoop1.0到2.0演進文檔: https://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-yarn/

《hadoop 權威指南》

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