1. 程式人生 > >Hadoop生態系統——YARN

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排程器即得到了高的資源利用率又能保證小任務及時完成。

參考:

《hadoop 權威指南》