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需要被重新執行。