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 {

  主要的屬性

  (1)事件隊列:    BlockingQueue<Event> eventQueue;

  (2)事件分發器:   Map<Class<? extends Enum>, EventHandler> eventDispatchers

  (3)處理事件的線程  Thread eventHandlingThread

  主要的方法

    1、從eventQueue中取出事件以及處理事件

  (1)createThread():返回一個Runnable對象,該線程類對象有一個while循環,不斷eventQueue中取出事件(RM啟動之后),event = eventQueue.take();然后將事件分發出去dispatch(event)。

  (2)dispatch(event):首先得到事件的類型,然后從eventDispatchers中根據事件類型得到相應的事件處理器EventHandler,然后EventHandler.handle(event)對事件進行處理。

    2、向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將事件交給真正的事件處理實體進行處理。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM