YARN的AsyncDispatcher原理
博客原文:hackershell
YARN采用了基于事件驱动的并发模型,该模型能极大的提高应用程序并发性,在RM中,几乎所有的事件都通过AsyncDispatcher进行事件的派发.
其基本架构图如下:
从基本的架构图可以简单的看出,该模型还需要几个基本的要素,那就是事件(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的设计实现的了解.