博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
YARN的AsyncDispatcher原理
阅读量:6293 次
发布时间:2019-06-22

本文共 2195 字,大约阅读时间需要 7 分钟。

博客原文:

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

其基本架构图如下:

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 RmNodesthis.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的设计实现的了解.

转载地址:http://glvta.baihongyu.com/

你可能感兴趣的文章
驰骋工作流引擎三种项目集成开发模式
查看>>
SUSE11修改主机名方法
查看>>
jdk6.0 + Tomcat6.0的简单jsp,Servlet,javabean的调试
查看>>
Android:apk签名
查看>>
2(2).选择排序_冒泡(双向循环链表)
查看>>
MySQL 索引 BST树、B树、B+树、B*树
查看>>
微信支付
查看>>
CodeBlocks中的OpenGL
查看>>
短址(short URL)
查看>>
第十三章 RememberMe——《跟我学Shiro》
查看>>
mysql 时间函数 时间戳转为日期
查看>>
索引失效 ORA-01502
查看>>
Oracle取月份,不带前面的0
查看>>
Linux Network Device Name issue
查看>>
IP地址的划分实例解答
查看>>
如何查看Linux命令源码
查看>>
运维基础命令
查看>>
入门到进阶React
查看>>
SVN 命令笔记
查看>>
检验手机号码
查看>>