1. 程式人生 > 實用技巧 >Yarn 資源排程,面試必備!

Yarn 資源排程,面試必備!

Yarn

1 Yarn 是什麼

Apache YARN(Yet Another Resource Negotiator)是 Hadoop 的叢集資源管理系統。Yarn 被引入 Hadoop 2,最初是為了蓋申 MapReduce 的實現, 但它具有足夠的通用性,同樣可以支援其他的分散式計算模式。

Yarn 提供請求和使用叢集資源的 API,但這些 API 很少直接用於使用者程式碼。相反,使用者程式碼中用的是分散式計算框架提供的更高層 API,這些 API 建立在 Yarn 之上,且向用戶隱藏了資源管理細節。下圖對此進行了描述,一些分散式計算框架(MapReduce,Spark 等等)作為 Yarn 應用執行在叢集計算層(Yarn)和叢集儲存層(HDFS 和 HBase)上。

Yarn 使用場景

還有一層應用是建立在上圖 Application 之上。如 Pig、Hive 等都是執行在 MapReduce、Spark 或 Tez(或三個都可)之上的處理框架,它們不和 Yarn 直接打交道。

2 Yarn 執行機制

Yarn 通過兩類長期執行的守護程序提供自己的核心服務:管理叢集上資源使用的資源管理器(resource manager)、執行在叢集中所有節點上且能夠啟動和監控容器(container)的節點管理器(node manager)。容器用於執行特定應用程式的程序。每個容器都有資源限制(記憶體、CPU等)。一個容器可以是一個 Unix 程序,也可以是一個 Linux cgroup,取決於 Yarn 的配置,下圖描述了 Yarn 是如何執行一個應用。

Yarn 執行應用

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

注意,Yarn 本身不會為應用的各部分(客戶端,master 和程序)彼此間通訊提供任何手段。大多數重要的 Yarn 應用使用某種形式的遠端通訊機制(例如 Hadoop 中的 RPC 層)來向客戶端傳遞狀態更新和返回結果,但是這些通訊機制都是屬於各應用的。

2.1 資源請求

Yarn 有一個靈活的資源請求模型。當請求多個容器時,可以指定每個容器需要的計算機資源數量(記憶體和 CPU),還可以指定對容器的本地限制要求。

本地化對於確保分散式資料處理演算法高效使用叢集頻寬非常重要,因此,Yarn 允許一個應用為所申請的容器執行本地限制。本地限制可以用於申請位於指定節點或機架,或叢集中任何位置(機架外)的容器。

有時本地限制無法被滿足,這種情況下要麼不分配資源,或者可以選擇放鬆限制,例如,一個節點由於已經運行了別的容器而無法再啟動新的容器,這是如果有應用請求該節點,則 Yarn 將嘗試在同一機架的其他節點上啟動一個容器,如果還不行,則會嘗試叢集中的任何一個節點。

通常情況下,當啟動一個容器用於處理 HDFS 資料塊時,應用將會向這樣的節點申請容器:儲存該資料塊的三個複本的幾點,或是儲存這些複本的機架中的一個節點。如果有申請失敗,則申請叢集中的任意節點。

Yarn 應用可以在執行中的任意時刻提出資源申請。例如,可以在最開始提出所有的請求,或者為了滿足不斷變化的應用需要,採取更為動態的方式在需要更多資源時提出請求。

Spark 採用了第一種方式,在叢集上啟動固定數量的執行器。另一方面,MapReduce 則分兩步走,在最開始時申請 map 任務容器,reduce 任務容器的啟動則放在後期。同樣,如果任何任務出現失敗,將會另外申請容器以重新執行失敗的任務。

2.2 應用生命期

Yarn 應用的生命週期我們可以按照應用到使用者執行的作業之間的對映關係對應用進行分類,最簡單的模型是一個使用者作業對應一個應用,這也是 MapReduce 採取的方式。

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

第三種模型是,多個使用者共享一個長期執行的應用。這種應用通常是作為一種協調者的角色在執行。由於避免了啟動新 application master 帶來的開銷,一個總是開啟的 application master 意味著使用者將獲得非常低延遲的查詢響應。

3 Yarn 資源排程

理想情況下,Yarn 應用發出的資源請求應該立刻給與滿足。然而現實中資源是有限的,在一個繁忙的叢集上,一個應用經常需要等待次啊能得到所需的資源。Yarn 排程器的工作就是根據既定策略為應用分配資源。

3.1 排程選項

Yarn 中有三種排程器可選:FIFO排程器(FIFO Scheduler),容量排程器(Capacity Scheduler)和公平排程器(Fair Scheduler)。FIFO 排程器將應用放置在一個佇列中,然後按照提交的順序(先進先出)執行應用。首先為佇列中第一個應用的請求分發資源,第一個應用的請求被滿足後再依次為佇列中下一個應用服務。

FIFO 排程器的優點是,簡單易懂,不需要任何配置,但是不適合共享叢集。大的應用會佔用叢集中的所有資源,所以每個應用必須等待直到輪到自己執行,在一個共享叢集中,更適合使用容量排程器或公平排程器。這兩中排程器都允許長時間執行的作業能及時完成,同時也允許正在進行較小臨時查詢的使用者能夠在合理的時間內得到返回結果。

下圖描述了排程器之間的差異性,當使用FIFO排程器(I)時,小作業一直被阻塞,直到大作業完成。使用容量排程器時(II),一個獨立的專門佇列保證小作業一提交就可以啟動,由於佇列容量是為那個佇列中的作業所保留的,因此這種策略是以整個叢集的利用率為代價的。這意味著與使用 FIFO 排程器相比,大作業執行的時間要長。使用公平排程器時(III),不需要預留一定量的資源,因為排程器會在所有執行的作業之間冬天平平衡資源,第一個(大)作業啟動時,它也是唯一執行的作業,因而獲得叢集中所有的資源。的那個第二個(小)作業啟動時,它被分配到叢集的一半資源,這樣每個作業都能公平共享資源。

注意,從第二個作業的啟動必須要等待第一個作業使用的容器用完並釋放資源。當小作業結束且不再申請資源後,大作業再將回去再次使用全部的叢集資源。最終的效果是:既得到了較高的叢集利用率,又能保證小作業能及時完成。

yarn 排程器