YARN的AsyncDispatcher学习
Posted lixiaolun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了YARN的AsyncDispatcher学习相关的知识,希望对你有一定的参考价值。
YARN采用了基于事件驱动的并发模型,该模型能极大的提高应用程序并发性,在RM中,几乎所有的事件都通过AsyncDispatcher进行事件的派发.
YARN中AsyncDispatcher的基本架构图如下:
然后再学习一下AsyncDispatcher的类图:
所有的event
从基本的架构图可以简单的看出,该模型还需要几个基本的要素,那就是事件(Event),事件类型(EventType)和处理事件对应的处理器(Handler).
在HADOOP中,事件被定义如下:
public interface Event<TYPE extends Enum<TYPE>> {
TYPE getType();
long getTimestamp();
String toString();
}
事件类型(EventType)则是简单的枚举类
主要功能定义事件有哪几种类型:
public enum NodesListManagerEventType {
NODE_USABLE,
NODE_UNUSABLE
}
处理事件的接口
主要功能处理相应的事件
public interface EventHandler<T extends Event> {
void handle(T event);
}
Dispatcher通过不同的事件类型(EventType)找到相应的handler对事件(event)进行处理.
对于AsyncDispatcher来说,它实现了Dispatcher接口:
public interface Dispatcher {
EventHandler getEventHandler();
void register(Class<? extends Enum> eventType, EventHandler handler);
}
其中有两个基本的方法,register和getEventHandler
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的设计实现的了解.
以上是关于YARN的AsyncDispatcher学习的主要内容,如果未能解决你的问题,请参考以下文章
Linux内核设计第二周学习总结 完成一个简单的时间片轮转多道程序内核代码
智能合约实战 solidity 语法学习 12 [ virtual 重写override 抽象abstract 接口interface 库library 销毁selfdestruct] 附代码(代码片