资讯专栏INFORMATION COLUMN

YARN的AsyncDispatcher原理

BoYang / 2037人阅读

摘要:博客原文采用了基于事件驱动的并发模型该模型能极大的提高应用程序并发性在中几乎所有的事件都通过进行事件的派发其基本架构图如下从基本的架构图可以简单的看出该模型还需要几个基本的要素那就是事件事件类型和处理事件对应的处理器在中事件被定义如下事件类

博客原文:hackershell

YARN采用了基于事件驱动的并发模型,该模型能极大的提高应用程序并发性,在RM中,几乎所有的事件都通过AsyncDispatcher进行事件的派发.

其基本架构图如下:

从基本的架构图可以简单的看出,该模型还需要几个基本的要素,那就是事件(Event),事件类型(EventType)和处理事件对应的处理器(Handler).

在HADOOP中,事件被定义如下:

public interface Event> {

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

事件类型(EventType)则是简单的枚举类

主要功能定义事件有哪几种类型:

public enum NodesListManagerEventType {
  NODE_USABLE,
  NODE_UNUSABLE
}

处理事件的接口

主要功能处理相应的事件

public interface EventHandler {
  void handle(T event);
}

Dispatcher通过不同的事件类型(EventType)找到相应的handler对事件(event)进行处理.

对于AsyncDispatcher来说,它实现了Dispatcher接口:

public interface Dispatcher {
  EventHandler getEventHandler();
  void register(Class 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 {
    public void handle(Event event) {
      try {
        eventQueue.put(event);
      } catch (InterruptedException e) {

      }
    };
  }

最后由dispatch进行通过传入的RMNodeEventType找到相应的NodeEventDispatcher(即EventHandler),并调用handle进行处理.

总结:
通过了解AsyncDispatcher可以提升自己理解Yarn的工作流程,加深对Yarn的设计实现的了解.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64370.html

相关文章

  • 0011 - YARN核心设计解析

    摘要:包括等,它们共同维护了一个事件与事件处理器的映射表,用来处理各个事件。例如内部包含一个中央异步调度器,并注册了等一系列事件事件处理器,由中央异步调度器统一管理和调度。当状态机转换到最终状态时,则退出。 大数据梦工厂( 0011 - YARN核心设计解析)1 - YARN RPC架构设计YARN RPC Serv...

    KoreyLee 评论0 收藏0
  • 前端核心工具:yarn、npm、cnpm三者如何优雅在一起使用 ?

    摘要:由于文件中版本号的特点,下面三个版本号在安装的时候代表不同的含义。安装版本统一为了防止拉取到不同的版本,有一个锁定文件记录了被确切安装上的模块的版本号。 showImg(https://segmentfault.com/img/bVbs8Rg?w=1920&h=1080); 一位用不好包管理器的前端,是一个入门级前端,一个用不好webpack的前端,是一个初级前端 三个包管理器是可以一...

    sihai 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<