Yarn源碼分析1(Hadoop2.7.2)

在Hadoop中,調度框架YARN(Yet Another Resource Negotiater)是基於事件的,調度的是MapReduce的Application。Application有一系列的狀態變化(NEW/NEW_SAVING/SUBMITTED/ACCEPTED/RUNNING/FINISHED/FAILED/KILLED ),即基於狀態機的變換(設計模式State Pattern),狀態之間的變換經過事件觸發。設計模式

①對AsyncDispatcher的介紹

核心類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);

}

②Yarn對事件的二次分發

事件分發,分兩次完成。第一次是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

}

③ResourceManager類中的Dispatcher

存在不一樣的事件,每種事件具備不一樣的類型,同一類型的事件交給一個XXXEventDispatcher(ResourceManager中定義了許多Dispatcher內部類),XXXEventDispatcher將事件交給真正的事件處理實體進行處理。

相關文章
相關標籤/搜索