Application管理
在yarn中,application指的是应用程序,他可能由多个实例组成。他有权限管理、运行状态几部分组成。权限管理主要由ApplicationACLsManager负责,应用程序的启动和关闭由RMAppManager负责,而运行状态主要由状态机负责。权限那里就略掉不写了,主要说一下状态机。
状态机管理
在ResourceManager内部主要有四类状态机:
- RMApp:和RMAppAttempt共同维护一个Application的生命周期。Application的声明周期由RMApp维护
- RMAppAttempt:一个Application可能尝试多次运行,每次尝试由RMAppAttempt维护。RMAppAttempt的生命周期与Application基本一致。因为如果一个ApplicationMaster失败了,yarn可能会另外启动一个ApplicationMaster,这就是这个Application的另一次尝试了
- RMContainer:ApplicationMaster启动后,会不断向RM申请Container来运行任务,Container的生命周期由RMContainer维护。
- RMNode:维护NodeManager的生命周期
下图是四个状态机转化的图,可以点进去看大图,应该清楚一些,我的版本是2.7.1。这里就不一一列举他们每个状态是怎么转化之类的,状态太多了,大家去看书吧。顺便提一句,yarn提供了生成这个图的方法。
mvn compile -Pvisualize
dot -Tpng ResourceManager.gv > ResourceManager.png
我们来选一个状态机看看yarn的代码结构,比如RMApp。RmApp是一个接口,同时extends了EventHandler<RMAppEvent>
。这意味着它一定会实现一个handle函数。至于RMapp的其他函数getUser啦反而不重要了。
它的实现是在RMAppImpl里面,打开这个类,首先会看到structure里面有一排内部类,当时我就慌了。不过静下心看一下,每个内部类都是extends一个xxTransition并实现了transition函数。回想一下状态机库,状态机工厂就是通过对一个StateMachineFactory不断addTransition并且最后调用installTopology生成的,之后通过make构造出一个状态机。这里的成员变量statMachine正是这样构造的。而addTranstion函数的参数如下:
|
|
其中第四个参数传入的就是我们看到的内部类,也就是说这个状态机在从状态perState接收到eventType转换到postState时会调用一下内部类xxTransition里的transition。这样程序结构就清楚了,至于状态具体如何转换也是看书吧。
最后再看看handle函数:
|
|
主要就是第十行调用stateMachine.doTransition不断完成状态转移。所以状态机的整个流程就是先用内部类实现各种transition。然后用addTranstion,installTopology和make构造出一个stateMachine。之后handle不断调用statMachine.doTransition来进行状态转移。
至于真正的状态变化,建议看一遍书,有个大概印象,之后遇到问题再回去查。因为太复杂了,真心记不住
本文采用创作共用保留署名-非商业-禁止演绎4.0国际许可证,欢迎转载,但转载请注明来自http://thousandhu.github.io,并保持转载后文章内容的完整。本人保留所有版权相关权利。
本文链接:http://thousandhu.github.io/2016/07/27/深入解析yarn架构设计与技术实现-Resource-Manager剖析2/