YARN/MRv2 ResourceManager代码结构分析

ResourceManager相当于整个系统的master,主要功能是启动application的ApplicationMaster和分配系统资源。

ResourceManager的核心代码在java包 org.apache.hadoop.yarn.server.resourcemanager中的ResourceManager类中,主要涉及到三种 对象:事件处理器,RPC服务和普通服务,其中事件处理器实现EventHandler接口,并被注册到统一的事件调度器AsyncDispatcher 中,由该调度器进行统一管理和调度:

……

private EventHandler<SchedulerEvent>schedulerDispatcher; //实际上是AsyncDispatcher

……

this.rmDispatcher.register(RMAppEventType.class,

new ApplicationEventDispatcher(this.rmContext));

……

Register函数有两个参数,第一个是事件类型,另一个是事件处理器。

每种事件对应一种事件处理器,一旦该事件发生,事件调度器会直接交由其对应的事件处理器处理,而事件处理器实际上是一个状态机,事件会使一个对象从一种状态变为另一种状态,并触发相应的行为;

RPC服务主要功能是创建一个RPC server,供远程客户端调用提供的服务(接口)。实现时,会继承AbstractService抽象类,实现某个RPC协议,并调用YarnRPC中 的getServer接口创建一个server以供客户端RPC调用。主要涉及四个RPC服务,分别是 ApplicationMasterService(实现AMRMProtocol协议),ResourceTrackerService(实现 ResourceTracker协议),ClientRMService(实现ClientRMProtocol协议)和AdminService(实现 RMAdminProtocol服务)

普通服务继承AbstractService抽象类,一般为一个后台线程或者普通对象。RPC服务和普通服务会被组装到组合服务对象CompositeService中,以便统一进行管理(启动、停止等)。

YARN/MRv2 ResourceManager代码结构分析

【四种actor】

四个概念,每个代表一个actor,对应一个状态机。

RMApp:application的状态信息,

由org.apache.hadoop.yarn.server.resourcemanager.rmapp/RMAppImpl.java实现。

RMAppAttempt:运行application的一次尝试(每个application从1开始逐步尝 试运行,如果失败,则继续尝试运行,直到成功或者到达某个尝试上限,如果成果,则该application运行成功。一个RMApp可能对一个多个 RMAppAttempt),由 org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt/

RMAppAttemptImpl.java实现

RMContainer:各个container的状态信息,由org.apache.hadoop.yarn.server.resourcemanager.rmcontainer/

RMContainerImpl.java实现。

RMNode:YARN集群中每个节点的状态信息,由org.apache.hadoop.yarn.server.resourcemanager.rmnode/RMNodeImpl.java

【PRC服务】

ClientRMService:实现ClientRMProtocal协议,负责与client交互,接收来自client端的请求并作出响应。

ApplicationMasterService:实现了AMRMProtocol通信协议,负责与ApplicationMaster交互,接收来自ApplicationMaster的请求并作出相应。

ResourceTrackerService:实现了ResourceTracker协议,主要负责管理各个NodeManager,如新NodeManager注册,死NodeManager的剔除,会调用NMLivelinessMonitor的一些接口。

AdminService:实现RMAdminProtocol协议,主要负责整个系统权限管理,如哪些client可以修改系统中队列名称,给某些队列增加资源等。

【其他类】

ApplicationMasterLauncher:创建ApplicationMaster

NMLivelinessMonitor:监控各个Nodemanager是否存活,默认情况下,如果某个NodeManage在10min内卫汇报心跳,则认为该节点出现故障。

RMAppManager:application管理者,client端提交的作业会最终提交给该类。

ResourceScheduler:非常核心的组件,application调度器,当某个节点出现空闲资源 使,采用某种策略从application队列中选择某个application使用这些空闲资源。当前有两种调度器: FIFO(First In First Out,默认调度器)和CapacityScheduelr(与Hadoop MapReduce中的Capacity Scheduler思想相同)。

ApplicationACLsManager:Application权限管理,即:对于某个application,哪些用户可以查看运行状态,哪些可以修改运行时属性,如优先级等。

NodesListManager:node列表管理,可以动态往集群中添加节点或者减少节点。

【代码整体划分】

下图是整个ResourceManager相关代码的java package注释:

YARN/MRv2 ResourceManager代码结构分析

相关推荐