服务库
对于生命周期较长的对象, YARN 采用了基于服务的对象管理模型对其进行管理, 该模型主要有以下几个特点。
- 将每个被服务化的对象分为 4 个状态: NOTINITED(被创建)、INITED(已初始化)、 STARTED(已启动)、STOPPED(已停止)。
- 任何服务状态变化都可以触发另外一些动作。
- 可通过组合的方式对任意服务进行组合, 以便进行统一管理。
YARN 中关于服务模型的类图(位于包 org.apache.hadoop.service 中) 如图所示:
在这个图中, 我们可以看到, 所有的服务对象最终均实现了接口 Service,它定义了最基本的服务初始化、启动、停止等操作,而 AbstractService 类提供了一个最基本的 Service 实现。YARN 中所有对象,如果是非组合服务,直接继承 AbstractService 类即可,否则需继承 CompositeService。比如,对于ResourceManager 而言,它是一个组合服务,它组合了各种服务对象,包括 ClientRMService、ApplicationMasterLauncher、ApplicationMasterService 等。
在 YARN 中, ResourceManager 和 NodeManager 属于组合服务, 它们内部包含多个单一服务和组合服务, 以实现对内部多种服务的统一管理。
事件库
YARN 采用了基于事件驱动的并发模型, 该模型能够大大增强并发性, 从而提高系统整体性能。 为了构建该模型, YARN 将各种处理逻辑抽象成事件和对应事件调度器, 并将每类事件的处理过程分割成多个步骤, 用有限状态机表示。 YARN 中的事件处理模型可概括为图所示。
整个处理过程大致为:处理请求会作为事件进入系统,由中央异步调度器(AsyncDispatcher)负责传递给相应事件调度器(Event Handler)。该事件调度器可能将该事件转发给另外一个事件调度器,也可能交给一个带有有限状态机的事件处理器,其处理结果也以事件的形式输出给中央异步调度器。而新的事件会再次被中央异步调度器转发给下一个事件调度器,直至处理完成(达到终止条件)。
在 YARN 中,所有核心服务实际上都是一个中央异步调度器,包括 ResourceManager、NodeManager、 MRAppMaster(MapReduce 应用程序的 ApplicationMaster)等,它们维护了事先注册的事件与事件处理器,并根据接收的事件类型驱动服务的运行.YARN 中事件与事件处理器类的关系(位于包 org.apache.hadoop.yarn.event 中)如图所示。