YARN的AsyncDispatcher原理

博客原文:hackershellnode

YARN採用了基於事件驅動的併發模型,該模型能極大的提升應用程序併發性,在RM中,幾乎全部的事件都經過AsyncDispatcher進行事件的派發.shell

其基本架構圖以下:segmentfault

AsyncDispatcher

從基本的架構圖能夠簡單的看出,該模型還須要幾個基本的要素,那就是事件(Event),事件類型(EventType)和處理事件對應的處理器(Handler).架構

在HADOOP中,事件被定義以下:併發

public interface Event<TYPE extends Enum<TYPE>> {

  TYPE getType();
  long getTimestamp();
  String toString();
}

事件類型(EventType)則是簡單的枚舉類svg

主要功能定義事件有哪幾種類型:this

public enum NodesListManagerEventType {
  NODE_USABLE,
  NODE_UNUSABLE
}

處理事件的接口spa

主要功能處理相應的事件設計

public interface EventHandler<T extends Event> {
  void handle(T event);
}

Dispatcher經過不一樣的事件類型(EventType)找到相應的handler對事件(event)進行處理.code

對於AsyncDispatcher來講,它實現了Dispatcher接口:

public interface Dispatcher {
  EventHandler getEventHandler();
  void register(Class<? extends Enum> eventType, EventHandler handler);
}

其中有兩個基本的方法,registergetEventHandler

register在AsyncDispatcher使用以前就須要先註冊eventType和對應的EventHandler,而getEventHandler方法主要則是把事件(event)放入eventQueue中.

接下來在ResourceManager舉個簡單的例子:

在RM初始化自身基本服務的時候,會把相應的事件類型(EventType)和事件處理器(EventHandler),先註冊在AsyncDispatcher上,以便於派發器在事件(event)到來時作出相應的處理.

RM的部分代碼:

// Register event handler for RmNodes
this.rmDispatcher.register(RMNodeEventType.class,
    new NodeEventDispatcher(this.rmContext));

其實註冊也就是把相應的類型和處理器放到一個HashMap

由於是資源管理方面的服務,因此咱們進入ResourceTrackerService類中,找到nodesListManager這個實例,經過代碼能夠知道nodesListManager是用來管理節點是否可用,並做出相應的處理

// 2. Check if it's a valid (i.e. not excluded) node
    if (!this.nodesListManager.isValidNode(rmNode.getHostName())) {
      String message =
          "Disallowed NodeManager nodeId: " + nodeId + " hostname: "
              + rmNode.getNodeAddress();
      LOG.info(message);
      shutDown.setDiagnosticsMessage(message);
      this.rmContext.getDispatcher().getEventHandler().handle(
          new RMNodeEvent(nodeId, RMNodeEventType.DECOMMISSION));
      return shutDown;
    }

從代碼能夠看出,若是節點是非法的,則從Dispatcher獲取Handler,並構造一個RMNodeEventType.DECOMMISSION類型的事件,這個RMNodeEvent將會被放到eventQueue中

class GenericEventHandler implements EventHandler<Event> {
    public void handle(Event event) {
      try {
        eventQueue.put(event);
      } catch (InterruptedException e) {

      }
    };
  }

最後由dispatch進行經過傳入的RMNodeEventType找到相應的NodeEventDispatcher(即EventHandler),並調用handle進行處理.

總結: 經過了解AsyncDispatcher能夠提高本身理解Yarn的工做流程,加深對Yarn的設計實現的瞭解.

相關文章
相關標籤/搜索