在Hadoop中,调度框架YARN(Yet Another Resource Negotiater)是基于事件的,调度的是MapReduce的Application。Application有一系列的状态变化(NEW/NEW_SAVING/SUBMITTED/ACCEPTED/RUNNING/FINISHED/FAILED/KILLED ),即基于状态机的变换(设计模式State Pattern),状态之间的变换经过事件触发。设计模式
核心类AsyncDispatcher:异步事件分发器(Yarn中最底层的总管道)框架
AsyncDispatcher extends AbstractService implements Dispatcher {异步
主要的属性oop
(1)事件队列: BlockingQueue<Event> eventQueue;this
(2)事件分发器: Map<Class<? extends Enum>, EventHandler> eventDispatchersspa
(3)处理事件的线程 Thread eventHandlingThread线程
主要的方法设计
一、从eventQueue中取出事件以及处理事件对象
(1)createThread():返回一个Runnable对象,该线程类对象有一个while循环,不断从eventQueue中取出事件(RM启动以后),event = eventQueue.take();而后将事件分发出去dispatch(event)。blog
(2)dispatch(event):首先获得事件的类型,而后从eventDispatchers中根据事件类型获得相应的事件处理器EventHandler,而后EventHandler.handle(event)对事件进行处理。
二、向eventQueue中添加事件
AsyncDispatcher 的内部类GenericEventHandler implements EventHanler的handle(event)方法向eventQueue中添加事件eventQueue.put(event);
}
事件分发,分两次完成。第一次是eventHandlingThread轮询出事件以后,由AsyncDispatcher的dispatch方法进行分发,第二次分发会调用相应的分发器,好比 ApplicationEventDispatcher,ApplicationEventDispatcher本身没有处理这个事件,而是将事件交给了RMApp,RMApp的实现类RMAppImpl.handle(event)最终处理了事件。
RMAppImpl的handler(event)方法,这个方法是不断重复执行的,:
this.writeLock.lock();
/* keep the master in sync with the state machine 进行状态机的转换*/
this.stateMachine.doTransition(event.getType(), event);
this.writeLock.unlock();
RMAppImpl的handler(event)不断变换状态机的状态,即handler被调用屡次,从NEW状态开始不断变换。RM应用的状态以下所示。
public enum RMAppState {
NEW,
NEW_SAVING,
SUBMITTED,
ACCEPTED,
RUNNING,
FINAL_SAVING,
FINISHING,
FINISHED,
FAILED,
KILLING,
KILLED
}
存在不一样的事件,每种事件具备不一样的类型,同一类型的事件交给一个XXXEventDispatcher(ResourceManager中定义了许多Dispatcher内部类),XXXEventDispatcher将事件交给真正的事件处理实体进行处理。