1. 程式人生 > >YARN框架原理及執行機制

YARN框架原理及執行機制

  YARN是Hadoop2.0中的資源管理系統,它的設計思想是將MRv1中的JobTracker拆分成兩個獨立的服務:一個全域性的資源管理器ResourceManager和每個應用程式持有的ApplicationMaster。其中RM負責整個系統的資源管理和分配,AM負責單個應用程式的管理。

一、YARN基本組成結構

  YARN總體上仍然是Master/Slaver結構,在整個資源管理框架中,RM為Master,NM為Slaver,RM負責對各個NM上的資源進行統一管理和排程。當提交一個應用程式時,需要提供一個用以跟蹤和管理這個程式的AM,它負責向RM申請資源,並要求NM啟動佔用一定資源的任務,不同的AM被分佈在不同的節點上。

1、ResourceManager(RM)

  RM是一個全域性的資源管理器,負責整個系統的資源管理和分配。主要由兩個元件構成:排程器(Scheduler)和應用程式管理器(ASM)。

(1)排程器

  排程器根據容量、佇列等限制條件(如每個佇列分配一定的資源,最多執行一定數量的任務等,即排程策略),將系統中的資源分配給各個正在執行的程式。該排程器是“純排程器”,它不再從事任何與具體應用程式相關的工作。排程器僅根據各個應用程式的資源需求進行資源分配,資源分配單位用一個抽象概念“資源容器(簡稱Container)”表示,Container將記憶體、CPU、磁碟、網路等資源封裝在一起。

(2)應用程式管理器

  應用程式管理器負責管理整個系統中所有應用程式,包括應用程式提交、與排程器協商資源以啟動AM、監控AM執行狀態並在失敗時重啟程式等。

2、ApplicationMaster(AM)

  提交的每個應用程式包含一個AM,主要功能包括:

  與RM排程器協商獲取資源(用Container表示);

  為應用程式申請資源並分配給內部的任務;

  與NM通訊以啟/停任務;

  監控所有任務狀態,並在任務失敗時重新申請資源以重啟任務;

3、NodeManager(NM)

  NM是每個節點上的資源和工作管理員,一方面,它會定時地向RM彙報本節點上的資源使用情況和各個Container的執行狀態;另一方面,它接收並處理來自AM的Container啟動/停止等各種請求。

4、Container

  Container 是YARN中的資源抽象,它封裝了某個節點上的多維度資源,如記憶體、CPU、磁碟、網路等,當AM向RM申請資源時,RM為AM返回的資源便是用 Container表示的。YARN會為每個任務分配一個Container,且該任務只能使用該Container中的資源。

二、YARN工作流程

1、向YARN提交應用程式;

2、RM分配第一個Container,並與對應的NM通訊,要求它在這個Container啟動應用程式的ApplicationMaster;

3、AM首先向RM註冊,通過RM可以檢視應用程式的執行狀態,然後它將為各個任務申請資源,並監控它的執行狀態,直至執行結束;

4、AM採用輪詢的方式通過RPC協議向RM申請和領取資源;

5、一旦AM申請到資源後,便與對應的NM通訊,要求它啟動任務;

6、NM為任務設定好執行環境(包括環境變數、JAR包、二進位制程式等)後,將任務啟動命令寫到一個指令碼中,並通過執行該指令碼啟動任務;

7、各個任務通過RPC協議向AM彙報自己的狀態和進度,以讓AM隨時掌握各個任務的執行狀態,從而可以在任務失敗時重啟任務;

8、應用程式執行完成後,AM向RM登出並關閉自己。

三、YARN排程機制

  YARN預設使用的是最簡單FIFO排程器,即一個default佇列,所有使用者共享,分配資源先到先得,沒有優先順序之分。YARN還有兩種資源排程器,capacity scheduler和fair scheduler。

1、capacity scheduler

  capacity scheduler排程器以佇列為單位劃分資源。一個個佇列有獨立的資源,佇列的結構和資源是可以進行配置的。佇列以分層方式組織資源,設計了多層級別的資源限制條件以更好的讓多使用者共享一個Hadoop叢集,比如佇列資源限制、使用者資源限制、使用者應用程式數目限制。佇列裡的應用以FIFO方式排程,每個佇列可設定一定比例的資源最低保證和使用上限,同時,每個使用者也可以設定一定的資源使用上限以防止資源濫用。而當一個佇列的資源有剩餘時,可暫時將剩餘資源共享給其它佇列。

capacity排程器具有以下幾個特徵:1)層次化的佇列設計,保證子佇列可以使用父佇列設定的全部資源;2)容量保證,佇列上都會設定一個資源的佔比,保證每個佇列都不會佔用整個叢集的資源;3)安全,每個佇列嚴格的訪問控制;4)彈性分配,空閒的資源可以被分配給任何佇列;5)多租戶使用,通過佇列的容量限制,多個使用者可以共享一個叢集;6)操作性,yarn支援動態修改調整容量、許可權等的分配,可以在執行時直接修改;7)基於資源的排程,協調不同資源需求的應用程式。

2、fair scheduler

  fair排程器的設計目標是為所有的應用分配公平的資源(對公平的定義可以通過引數來設定),公平排程可以在多個佇列間工作。假設有兩個使用者A和B,他們分別擁有一個佇列,當A啟動一個job而B沒有任務時,A會獲得全部叢集資源;當B啟動一個job後,A的job會繼續執行,不過一會兒之後兩個任務會各自獲得一半的叢集資源;如果此時B再有第二個job並且其它job還在執行,則它和B的第一個job共享B這個佇列資源,也就是B的兩個job各自佔用四分之一的叢集資源,而A的job仍然佔用一半的叢集資源,結果就是資源最終在兩個使用者之間平等的共享,過程如下圖所示:

  所有的佇列都是root佇列的子佇列,fair排程器中的佇列有一個權重屬性,這個權重就是對公平的定義。每個佇列內部扔可以有不同的排程策略,佇列的預設排程策略可以通過頂級元素<defaultQueueSchedulingPolicy>進行配置,每個佇列的排程策略可以被內部的<schedulingPolicy>元素覆蓋。

  當一個job提交到一個繁忙叢集中的空佇列時,job並不會馬上執行,而是阻塞直到正在執行的job釋放系統資源。為了使提交job的時間更具有預測性(可以設定等待的超時時間),fair排程器支援搶佔。搶佔就是允許排程器殺掉佔用超過其應占份額資源佇列的containers,這些containers資源便可分配到應該享有這些份額資源的佇列中。需要注意搶佔會降低叢集的執行效率,因為被終止的containers需要被重新執行。