在Hadoop中,調度框架YARN(Yet Another Resource Negotiater)是基於事件的,調度的是MapReduce的Application。Application有一系列的狀態變化(NEW/NEW_SAVING/SUBMITTED/ACCEPTED/RUNNING/FINISHED/FAILED/KILLED ),即基於狀態機的變換(設計模式State Pattern),狀態之間的變換經過事件觸發。設計模式
核心類AsyncDispatcher:異步事件分發器(Yarn中最底層的總管道)框架
AsyncDispatcher extends AbstractService implements Dispatcher {異步
主要的屬性oop
(1)事件隊列: BlockingQueue<Event> eventQueue;this
(2)事件分發器: Map<Class<? extends Enum>, EventHandler> eventDispatchersspa
(3)處理事件的線程 Thread eventHandlingThread線程
主要的方法設計
一、從eventQueue中取出事件以及處理事件對象
(1)createThread():返回一個Runnable對象,該線程類對象有一個while循環,不斷從eventQueue中取出事件(RM啓動以後),event = eventQueue.take();而後將事件分發出去dispatch(event)。blog
(2)dispatch(event):首先獲得事件的類型,而後從eventDispatchers中根據事件類型獲得相應的事件處理器EventHandler,而後EventHandler.handle(event)對事件進行處理。
二、向eventQueue中添加事件
AsyncDispatcher 的內部類GenericEventHandler implements EventHanler的handle(event)方法向eventQueue中添加事件eventQueue.put(event);
}
事件分發,分兩次完成。第一次是eventHandlingThread輪詢出事件以後,由AsyncDispatcher的dispatch方法進行分發,第二次分發會調用相應的分發器,好比 ApplicationEventDispatcher,ApplicationEventDispatcher本身沒有處理這個事件,而是將事件交給了RMApp,RMApp的實現類RMAppImpl.handle(event)最終處理了事件。
RMAppImpl的handler(event)方法,這個方法是不斷重複執行的,:
this.writeLock.lock();
/* keep the master in sync with the state machine 進行狀態機的轉換*/
this.stateMachine.doTransition(event.getType(), event);
this.writeLock.unlock();
RMAppImpl的handler(event)不斷變換狀態機的狀態,即handler被調用屢次,從NEW狀態開始不斷變換。RM應用的狀態以下所示。
public enum RMAppState {
NEW,
NEW_SAVING,
SUBMITTED,
ACCEPTED,
RUNNING,
FINAL_SAVING,
FINISHING,
FINISHED,
FAILED,
KILLING,
KILLED
}
存在不一樣的事件,每種事件具備不一樣的類型,同一類型的事件交給一個XXXEventDispatcher(ResourceManager中定義了許多Dispatcher內部類),XXXEventDispatcher將事件交給真正的事件處理實體進行處理。