攻击jsp网站,普洱建设网站,北京外贸营销网站建设费用,网站推广软件推广Yarn的状态机框架分析
什么是状态机
状态机(State Machine)#xff0c;是有限状态自动机的简称。简单解释#xff1a;给定一个状态机#xff0c;同时给定它的当前状态和输入#xff0c;那么输出状态时可以明确的运算出来的。
yarn中的状态机
YARN将各种处理逻辑抽象成事…Yarn的状态机框架分析
什么是状态机
状态机(State Machine)是有限状态自动机的简称。简单解释给定一个状态机同时给定它的当前状态和输入那么输出状态时可以明确的运算出来的。
yarn中的状态机
YARN将各种处理逻辑抽象成事件和对应事件调度器 并将每类事件的处理过程分割成多个步骤 用有限状态机表示。
在Yarn中App、AppAttempt、Container、Node都可以使用状态机表示。其中
RMApp:用于维护一个Application的生命周期
RMAppAttempt:用于维护一次尝试运行的生命周期
RMContainer:用于维护一个已分配的资源最小单位Container的生命周期
RMNode:用于维护一个NodeManager的生命周期。
关于yarn的处理过程
状态机是与事件模型结合使用的在Service中注册转调度处理器然后在处理器使用状态机。
整个处理过程大致为 处理请求会作为事件进入系统 由异步调度器AsyncDispatcher 负责传递给相应事件调度器Event Handler 。 该事件调度器可能将该事件转发给另外一个事件调度器 也可能交给一个带有有限状态机的事件处理器 其处理结果也以事件的形式输出给中央异步调度器。 而新的事件会再次被中央异步调度器转发给下一个事件调度器 直至处理完成达到终止条件 。
使用状态机的目的
Yarn状态机就负责合理地组织这些状态转换流程快速找到指定初始状态和事件类型对应的状态转换方法。
状态机举例
例如对于一个应用RMApp而言RMApp存在一个初始状态处理事件时会根据事件类型匹配对应的转换类Transition将RMApp从初始状态转化成目标状态。RMApp经历的流程为初始状态–转换方法–目标状态将其所有流程汇总起来就是状态机。
各个使用状态机的事件处理类依赖状态工厂类StateMachineFactory完成了状态机的初始化。将状态机的处理流程通过链表结构TransitionsListNode进行组成。
在RMActiveServices的serviceInit方法中注册RMAppEventType事件的调度处理器ApplicationEventDispatcher
// Register event handler for RmAppEvents
rmDispatcher.register(RMAppEventType.class,new ApplicationEventDispatcher(rmContext));ApplicationEventDispatcher中去让RMApp的实现类RMAppImpl处理事件。
Override
public void handle(RMAppEvent event) {ApplicationId appID event.getApplicationId();RMApp rmApp this.rmContext.getRMApps().get(appID);if (rmApp ! null) {try {rmApp.handle(event);} catch (Throwable t) {LOG.error(Error in handling event type event.getType() for application appID, t);}}
}RMAppImpl的handle方法中通过调用状态的的转换方法doTransition来改变RMApp对象状态。
public void handle(RMAppEvent event) {this.writeLock.lock();try {ApplicationId appID event.getApplicationId();LOG.debug(Processing event for appID of type event.getType());final RMAppState oldState getState();try {/* keep the master in sync with the state machine */this.stateMachine.doTransition(event.getType(), event);} catch (InvalidStateTransitionException e) {LOG.error(App: appID cant handle this event at current state, e);onInvalidStateTransition(event.getType(), oldState);}// Log at INFO if were not recovering or not in a terminal state.// Log at DEBUG otherwise.if ((oldState ! getState()) (((recoveredFinalState null)) ||(event.getType() ! RMAppEventType.RECOVER))) {LOG.info(String.format(STATE_CHANGE_MESSAGE, appID, oldState,getState(), event.getType()));} else if ((oldState ! getState()) LOG.isDebugEnabled()) {LOG.debug(String.format(STATE_CHANGE_MESSAGE, appID, oldState,getState(), event.getType()));}} finally {this.writeLock.unlock();}}简化实验
简化类图 #mermaid-svg-jdC9AOiCbtr8JiHt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-jdC9AOiCbtr8JiHt .error-icon{fill:#552222;}#mermaid-svg-jdC9AOiCbtr8JiHt .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jdC9AOiCbtr8JiHt .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-jdC9AOiCbtr8JiHt .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jdC9AOiCbtr8JiHt .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jdC9AOiCbtr8JiHt .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jdC9AOiCbtr8JiHt .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jdC9AOiCbtr8JiHt .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jdC9AOiCbtr8JiHt .marker.cross{stroke:#333333;}#mermaid-svg-jdC9AOiCbtr8JiHt svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jdC9AOiCbtr8JiHt g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-jdC9AOiCbtr8JiHt g.classGroup text .title{font-weight:bolder;}#mermaid-svg-jdC9AOiCbtr8JiHt .nodeLabel,#mermaid-svg-jdC9AOiCbtr8JiHt .edgeLabel{color:#131300;}#mermaid-svg-jdC9AOiCbtr8JiHt .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-jdC9AOiCbtr8JiHt .label text{fill:#131300;}#mermaid-svg-jdC9AOiCbtr8JiHt .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-jdC9AOiCbtr8JiHt .classTitle{font-weight:bolder;}#mermaid-svg-jdC9AOiCbtr8JiHt .node rect,#mermaid-svg-jdC9AOiCbtr8JiHt .node circle,#mermaid-svg-jdC9AOiCbtr8JiHt .node ellipse,#mermaid-svg-jdC9AOiCbtr8JiHt .node polygon,#mermaid-svg-jdC9AOiCbtr8JiHt .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jdC9AOiCbtr8JiHt .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-jdC9AOiCbtr8JiHt g.clickable{cursor:pointer;}#mermaid-svg-jdC9AOiCbtr8JiHt g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-jdC9AOiCbtr8JiHt g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-jdC9AOiCbtr8JiHt .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-jdC9AOiCbtr8JiHt .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-jdC9AOiCbtr8JiHt .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-jdC9AOiCbtr8JiHt .dashed-line{stroke-dasharray:3;}#mermaid-svg-jdC9AOiCbtr8JiHt #compositionStart,#mermaid-svg-jdC9AOiCbtr8JiHt .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-jdC9AOiCbtr8JiHt #compositionEnd,#mermaid-svg-jdC9AOiCbtr8JiHt .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-jdC9AOiCbtr8JiHt #dependencyStart,#mermaid-svg-jdC9AOiCbtr8JiHt .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-jdC9AOiCbtr8JiHt #dependencyStart,#mermaid-svg-jdC9AOiCbtr8JiHt .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-jdC9AOiCbtr8JiHt #extensionStart,#mermaid-svg-jdC9AOiCbtr8JiHt .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-jdC9AOiCbtr8JiHt #extensionEnd,#mermaid-svg-jdC9AOiCbtr8JiHt .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-jdC9AOiCbtr8JiHt #aggregationStart,#mermaid-svg-jdC9AOiCbtr8JiHt .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-jdC9AOiCbtr8JiHt #aggregationEnd,#mermaid-svg-jdC9AOiCbtr8JiHt .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-jdC9AOiCbtr8JiHt .edgeTerminals{font-size:11px;}#mermaid-svg-jdC9AOiCbtr8JiHt :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} implements implements implements implements «interface» StateMachine STATE getCurrentState() STATE doTransition(EVENTTYPE eventType, EVENT event) «interface» SingleArcTransition void transition(OPERAND operand, EVENT event) «interface» MultipleArcTransition STATE transition(OPERAND operand, EVENT event) «interface» Transition STATE doTransition(OPERAND operand, STATE oldState, EVENT event, EVENTTYPE eventType) «interface» ApplicableTransition void apply(StateMachineFactory subject) ApplicableSingleOrMultipleTransition final STATE preState final EVENTTYPE eventType final Transition transition ApplicableSingleOrMultipleTransition(STATE preState, EVENTTYPE eventType, Transition transition) void apply(StateMachineFactory subject) SingleInternalArc - STATE postState; - SingleArcTransition hook; STATE doTransition(OPERAND operand, STATE oldState, EVENT event, EVENTTYPE eventType) MultipleInternalArc - Set validPostStates - MultipleArcTransition hook STATE doTransition(OPERAND operand, STATE oldState, EVENT event, EVENTTYPE eventType) TransitionsListNode final ApplicableTransition transition final TransitionsListNode next STATE doTransition(OPERAND operand, STATE oldState, EVENT event, EVENTTYPE eventType) InternalStateMachine final OPERAND operand STATE currentState final StateTransitionListener listener synchronized STATE getCurrentState() synchronized STATE doTransition(EVENTTYPE eventType, EVENT event) StateMachineFactory - final TransitionsListNode transitionsListNode - Map stateMachineTable final StateTransitionListener listener - STATE defaultInitialState - final boolean optimized StateMachineFactory addTransition(STATE preState, STATE postState, EVENTTYPE eventType, SingleArcTransition hook) StateMachineFactory addTransition(STATE preState, Set postStates, EVENTTYPE eventType, MultipleArcTransition hook) -STATE doTransition(OPERAND operand, STATE oldState, EVENTTYPE eventType, EVENT event) 事件类型
package com.donny.state;/*** author 1792998761qq.com* description* date 2023/9/27*/
public enum MyEventType {START,Change1,Change2
}
任务状态
package com.donny.state;/*** author 1792998761qq.com* description* date 2023/9/27*/
public enum MyState {NEW,State_1,State_2,FINISHED
}状态机框架相关
package com.donny.state;/*** author 1792998761qq.com* description* date 2023/9/27*/
public interface SingleArcTransitionOPERAND, EVENT {public void transition(OPERAND operand, EVENT event);
}package com.donny.state;/*** author 1792998761qq.com* description* date 2023/9/27*/
public interface MultipleArcTransitionOPERAND, EVENT, STATE extends EnumSTATE {public STATE transition(OPERAND operand, EVENT event);
}package com.donny.state;/*** author 1792998761qq.com* description* date 2023/9/27*/
public interface ApplicableTransitionOPERAND, STATE extends EnumSTATE,EVENTTYPE extends EnumEVENTTYPE, EVENT {void apply(StateMachineFactoryOPERAND, STATE, EVENTTYPE, EVENT subject);
}package com.donny.state;import java.util.HashMap;
import java.util.Map;/*** author 1792998761qq.com* description* date 2023/9/27*/
public class ApplicableSingleOrMultipleTransitionOPERAND, STATE extends EnumSTATE,EVENTTYPE extends EnumEVENTTYPE, EVENT implements ApplicableTransitionOPERAND, STATE, EVENTTYPE, EVENT {final STATE preState;final EVENTTYPE eventType;final TransitionOPERAND, STATE, EVENTTYPE, EVENT transition;ApplicableSingleOrMultipleTransition(STATE preState, EVENTTYPE eventType,TransitionOPERAND, STATE, EVENTTYPE, EVENT transition) {this.preState preState;this.eventType eventType;this.transition transition;}Overridepublic void apply(StateMachineFactoryOPERAND, STATE, EVENTTYPE, EVENT subject) {MapEVENTTYPE, TransitionOPERAND, STATE, EVENTTYPE, EVENT transitionMap subject.getStateMachineTable().get(preState);if (transitionMap null) {transitionMap new HashMapEVENTTYPE,TransitionOPERAND, STATE, EVENTTYPE, EVENT();subject.getStateMachineTable().put(preState, transitionMap);}transitionMap.put(eventType, transition);}
}package com.donny.state;import java.util.Set;/*** author 1792998761qq.com* description* date 2023/9/27*/
public class MultipleInternalArcOPERAND, STATE extends EnumSTATE,EVENTTYPE extends EnumEVENTTYPE, EVENT implements TransitionOPERAND, STATE, EVENTTYPE, EVENT {private SetSTATE validPostStates;private MultipleArcTransitionOPERAND, EVENT, STATE hook; // transition hookMultipleInternalArc(SetSTATE postStates,MultipleArcTransitionOPERAND, EVENT, STATE hook) {this.validPostStates postStates;this.hook hook;}Overridepublic STATE doTransition(OPERAND operand, STATE oldState,EVENT event, EVENTTYPE eventType)throws RuntimeException {STATE postState hook.transition(operand, event);if (!validPostStates.contains(postState)) {throw new RuntimeException(oldState: oldState ,eventType: eventType);}return postState;}
}public class MyTransition implements SingleArcTransition {Overridepublic void transition(Object o, Object o2) {System.out.println(do transition);}
}package com.donny.state;/*** author 1792998761qq.com* description* date 2023/9/27*/
public class SingleInternalArcOPERAND, STATE extends EnumSTATE,EVENTTYPE extends EnumEVENTTYPE, EVENT implements TransitionOPERAND, STATE, EVENTTYPE, EVENT {private STATE postState;private SingleArcTransitionOPERAND, EVENT hook; // transition hookSingleInternalArc(STATE postState,SingleArcTransitionOPERAND, EVENT hook) {this.postState postState;this.hook hook;}Overridepublic STATE doTransition(OPERAND operand, STATE oldState,EVENT event, EVENTTYPE eventType) {if (hook ! null) {hook.transition(operand, event);}return postState;}
}
package com.donny.state;/*** author 1792998761qq.com* description* date 2023/9/27*/
public interface TransitionOPERAND, STATE extends EnumSTATE,EVENTTYPE extends EnumEVENTTYPE, EVENT {STATE doTransition(OPERAND operand, STATE oldState, EVENT event, EVENTTYPE eventType);
}package com.donny.state;/*** author 1792998761qq.com* description* date 2023/9/27*/
public interface StateMachineSTATE extends EnumSTATE,EVENTTYPE extends EnumEVENTTYPE, EVENT {public STATE getCurrentState();public STATE doTransition(EVENTTYPE eventType, EVENT event)throws RuntimeException;
}package com.donny.state;/*** author 1792998761qq.com* description* date 2023/9/27*/
public class TransitionsListNodeOPERAND, STATE extends EnumSTATE,EVENTTYPE extends EnumEVENTTYPE, EVENT {final ApplicableTransitionOPERAND, STATE, EVENTTYPE, EVENT transition;final TransitionsListNode next;TransitionsListNode(ApplicableTransitionOPERAND, STATE, EVENTTYPE, EVENT transition,TransitionsListNode next) {this.transition transition;this.next next;}
}package com.donny.state;import java.util.*;/*** author 1792998761qq.com* description* date 2023/9/27*/
public class StateMachineFactoryOPERAND, STATE extends EnumSTATE,EVENTTYPE extends EnumEVENTTYPE, EVENT {private final TransitionsListNode transitionsListNode;private MapSTATE, MapEVENTTYPE,TransitionOPERAND, STATE, EVENTTYPE, EVENT stateMachineTable;private STATE defaultInitialState;private final boolean optimized;public StateMachineFactory(STATE defaultInitialState) {this.transitionsListNode null;this.defaultInitialState defaultInitialState;this.optimized false;this.stateMachineTable null;}private StateMachineFactory(StateMachineFactoryOPERAND, STATE, EVENTTYPE, EVENT that,ApplicableTransitionOPERAND, STATE, EVENTTYPE, EVENT t) {this.defaultInitialState that.defaultInitialState;this.transitionsListNode new TransitionsListNode(t, that.transitionsListNode);this.optimized false;this.stateMachineTable null;}public StateMachineFactoryOPERAND, STATE, EVENTTYPE, EVENTinstallTopology() {return new StateMachineFactoryOPERAND, STATE, EVENTTYPE, EVENT(this, true);}private StateMachineFactory(StateMachineFactoryOPERAND, STATE, EVENTTYPE, EVENT that,boolean optimized) {this.defaultInitialState that.defaultInitialState;this.transitionsListNode that.transitionsListNode;this.optimized optimized;if (optimized) {makeStateMachineTable();} else {stateMachineTable null;}}private void makeStateMachineTable() {StackApplicableTransitionOPERAND, STATE, EVENTTYPE, EVENT stack new StackApplicableTransitionOPERAND, STATE, EVENTTYPE, EVENT();MapSTATE, MapEVENTTYPE, TransitionOPERAND, STATE, EVENTTYPE, EVENTprototype new HashMapSTATE, MapEVENTTYPE, TransitionOPERAND, STATE, EVENTTYPE, EVENT();prototype.put(defaultInitialState, null);stateMachineTable new EnumMapSTATE, MapEVENTTYPE,TransitionOPERAND, STATE, EVENTTYPE, EVENT(prototype);for (TransitionsListNode cursor transitionsListNode;cursor ! null;cursor cursor.next) {stack.push(cursor.transition);}while (!stack.isEmpty()) {stack.pop().apply(this);}}public MapSTATE, MapEVENTTYPE, TransitionOPERAND, STATE, EVENTTYPE, EVENT getStateMachineTable() {return stateMachineTable;}private STATE doTransition(OPERAND operand, STATE oldState, EVENTTYPE eventType, EVENT event)throws RuntimeException {MapEVENTTYPE, TransitionOPERAND, STATE, EVENTTYPE, EVENT transitionMap stateMachineTable.get(oldState);if (transitionMap ! null) {TransitionOPERAND, STATE, EVENTTYPE, EVENT transition transitionMap.get(eventType);if (transition ! null) {return transition.doTransition(operand, oldState, event, eventType);}}throw new RuntimeException(RuntimeException: oldState eventType);}public StateMachineFactoryOPERAND, STATE, EVENTTYPE, EVENTaddTransition(STATE preState, STATE postState,EVENTTYPE eventType,SingleArcTransitionOPERAND, EVENT hook) {return new StateMachineFactoryOPERAND, STATE, EVENTTYPE, EVENT(this, new ApplicableSingleOrMultipleTransitionOPERAND, STATE, EVENTTYPE, EVENT(preState, eventType, new SingleInternalArc(postState, hook)));}public StateMachineFactoryOPERAND, STATE, EVENTTYPE, EVENTaddTransition(STATE preState, SetSTATE postStates,EVENTTYPE eventType,MultipleArcTransitionOPERAND, EVENT, STATE hook) {return new StateMachineFactoryOPERAND, STATE, EVENTTYPE, EVENT(this,new ApplicableSingleOrMultipleTransitionOPERAND, STATE, EVENTTYPE, EVENT(preState, eventType, new MultipleInternalArc(postStates, hook)));}private synchronized void maybeMakeStateMachineTable() {if (stateMachineTable null) {makeStateMachineTable();}}private class InternalStateMachineimplements StateMachineSTATE, EVENTTYPE, EVENT {private final OPERAND operand;private STATE currentState;InternalStateMachine(OPERAND operand, STATE initialState) {this.operand operand;this.currentState initialState;if (!optimized) {maybeMakeStateMachineTable();}}Overridepublic synchronized STATE getCurrentState() {return currentState;}Overridepublic synchronized STATE doTransition(EVENTTYPE eventType, EVENT event)throws RuntimeException {STATE oldState currentState;currentState StateMachineFactory.this.doTransition(operand, currentState, eventType, event);return currentState;}}public StateMachineSTATE, EVENTTYPE, EVENT make(OPERAND operand) {return new InternalStateMachine(operand, defaultInitialState);}
}package com.donny.state;/*** author 1792998761qq.com* description* date 2023/9/27*/
public class Test {private final StateMachine stateMachine;private static final StateMachineFactory stateMachineFactory new StateMachineFactory(MyState.NEW).addTransition(MyState.NEW, MyState.State_1, MyEventType.START, new MyTransition()).addTransition(MyState.State_1, MyState.State_2, MyEventType.Change1, new MyTransition()).addTransition(MyState.State_2, MyState.FINISHED, MyEventType.Change2, new MyTransition()).installTopology();public Test() {this.stateMachine stateMachineFactory.make(this);}public static void main(String[] args) {Test t new Test();System.out.println(t.stateMachine.getCurrentState());Object event new Object();t.stateMachine.doTransition(MyEventType.START, event);System.out.println(t.stateMachine.getCurrentState());t.stateMachine.doTransition(MyEventType.Change1, event);System.out.println(t.stateMachine.getCurrentState());t.stateMachine.doTransition(MyEventType.Change2, event);System.out.println(t.stateMachine.getCurrentState());}
}实验结果
NEW
do transition
State_1
do transition
State_2
do transition
FINISHED