Yarn的状态机StateMachine

这种大型的调度,主要用于类与类之间的调度,简单来说,就是一个类对于那些觉得自己管控不了的事情,就将其扔给别人来处理。

Yarn中很多的类都是有调度器的,而且它们大多都是持有全局调度器,对于自己处理不了的事情,干脆利落地将其扔到RM或者NM的调度器中。

全局调度器就相当于一个统筹者,一根线,把所有的类给串起来,而在很多类的内部,同样支持事件的处理,而本文就讨论下这种处理机制,状态机。

声明:本文有些图片来自于董老师的博客和书,所以给董老师的博客打个广告:

董的博客

接下来,我们认真讨论下状态机;先上两个类:

1:StateMachine

public interface StateMachine<STATE extends Enum<STATE>, EVENTTYPE extends Enum<EVENTTYPE>, EVENT> {
    public STATE getCurrentState();
    public STATE doTransition(EVENTTYPE eventType, EVENT event)
            throws InvalidStateTransitonException;
}
这是状态机的基本定义,一个接口,两个方法,getCurrentState获取状态机的当前状态,doTransition执行状态转化;具体分析具体的类是如何调用的。

2:StateMachineFactory

* @param <OPERAND>
 *            The object type on which this state machine operates.
 * @param <STATE>
 *            The state of the entity.
 * @param <EVENTTYPE>
 *            The external eventType to be handled.
 * @param <EVENT>
 *            The event object.
 *
 */
@Public
@Evolving
final public class StateMachineFactory<OPERAND, STATE extends Enum<STATE>, EVENTTYPE extends Enum<EVENTTYPE>, EVENT> 
注释很简单,OPERAND代表该状态机所在的实体,STATE代表该实体内当前状态机的状态,EVENTYPE代表需要处理的事件的类型,EVENT代表事件对象。

顾名思义,状态机工厂,负责生产状态机的类,这里,我们首先介绍成员变量,其中的方法,在具体分析某个类的状态机再讲述:

private final TransitionsListNode transitionsListNode;//转换的链表,承载了转变过程
private Map<STATE, Map<EVENTTYPE, Transition<OPERAND, STATE, EVENTTYPE, EVENT>>> stateMachineTable;//遇到再细说
private STATE defaultInitialState;//初始状态
private final boolean optimized;//遇到再说
接下来,我们找个状态机来分析一把

3:从RMAppAttemptImpl来说状态机:

    private final StateMachine<RMAppAttemptState, RMAppAttemptEventType, RMAppAttemptEvent> stateMachine;
其状态机的定义不多说:

从StateMachineFactory开始看,其状态机工厂的代码非常复杂,看最初的一段:

private static final StateMachineFactory<RMAppAttemptImpl, RMAppAttemptState, 
    RMAppAttemptEventType, RMAppAttemptEvent> stateMachineFactory = 
    new StateMachineFactory<RMAppAttemptImpl, RMAppAttemptState, RMAppAttemptEventType, RMAppAttemptEvent>(
            RMAppAttemptState.NEW)
从StateMachineFactory定义的角度来看看,这个状态机工厂的初始化定义:

RMAppAttemptImpl:本状态机工厂针对的实体类,状态机发生的转变所触及的操作,都是针对于该实体类的
RMAppAttemptState:其实就是RMAppAttemptImpl当前的状态
RMAppAttemptEventType:会触发状态机工厂或者状态机状态改变的事件类型,落到本类上,就是RMAppAttemptStateType,这种事件类型会触发RMAppAttemptImpl的改变
RMAppAttemptEvent:代表触发的事件对象,
状态机工厂的初始化:

    public StateMachineFactory(STATE defaultInitialState) {
        this.transitionsListNode = null;
        this.defaultInitialState = defaultInitialState;
        this.optimized = false;
        this.stateMachineTable = null;
    }
对照来看,发现我们这里新建的状态机工厂,默认状态是RMAppAttemptState.NEW,后续的状态转换,都会建立在这个初始状态基础之上,即这里的STATE已经变成了RMAppAttemptState.NEW:

接着看:

addTransition(RMAppAttemptState.NEW, RMAppAttemptState.SUBMITTED,
                    RMAppAttemptEventType.START, new AttemptStartedTransition())
这是调用的StateMachineFactory的方法,看看:

/**
     * @return a NEW StateMachineFactory just like {@code this} with the current
     *         transition added as a new legal transition
     *
     *         Note that the returned StateMachineFactory is a distinct object.
     *
     *         This method is part of the API.
     *
     * @p

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值