注:此记录仅做自己学习记录
yarn的resourceManager 是个全局的资源管理器,负责整个系统的资源管理和分配。它主要由两个组件
构成:调度器(Scheduler)和应用程序管理器(Applications Manager,ASM)
1: 调度器根据容量、队列等限制条件,将系统中的资源分配给各个正在运行的应用程序。需要注意的是,该调度器是一个“纯调度器”,它不再从事任何与具体应用程序相关的工作,比如不负责监控或者跟踪应用的执行状态等,也不负责重新启动因应用执行失败或者硬件故障而产生的失败任务;
2:应用程序管理器负责管理整个系统中所有应用程序,包括应用程序提交、与调度器协商资源以启动 ApplicationMaster、监控 ApplicationMaster 运行状态并在失败时重新启动它等
yarn 的NodeManager 是每个节点上的资源和任务管理器,一方面,它会定时地向 RM 汇报本节点上的资源使用情况和各个 Container 的运行状态;另一方面,它接收并处理来自 AM 的 Container启动 / 停止等各种请求。
Container 是 YARN 中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当 AM 向 RM 申请资源时,RM 为 AM 返回的资源便是用 Container表示的。
yarn的提交过程简单的总结如下:
第一步:client 通过RPC 的applicationClientProcotol协议提交客户自己编码的应用程序到 resourceManager,
resourceManager 收到请求后,先向资源调度器申请用以启动 applicationMaster 的资源,待申请资源后,再有 applicationMasterLauncher 与对应的 nodeManger通信,启动 applicationMaster。刚启动的applicationMaster的时候
applicationMasterLauncher会通过事件机制把 applicationMaster 注册到 AMLivelinesMiontor 服务,启动心跳监测;
第二步:applicationMaster 启动后,会经过事件机制,再经过 rpc 向 resourceManager 的 applicationMasterService 进行注册,注册信息封装在 registerApplicationMasterRequest 类中,包括节点的host,rpc_port 和 application 的作业跟踪的webURL
第三步:applicationMaster 运行过程中,会周期的向applicationMasterService 汇报心跳;applicationMasterService接受到心跳会,再通知 resourceMaster 的 AMLivelinesMiontor 跟新心跳时间;
注:resourceManager 中有三个服务
1:applicationMasterLauncher服务
1:AMLivelinesMiontor服务
2:applicationMasterService 服务
第四步:applicationMaster 向resourceManager 申请资源,包括资源列表,资源量,资源优先级;
第五部:applicationMaster 申请到资源后,通过RPC函数 ContainerManagermentProtocol 与对应的nodeManager通信以启动container;
注:nodeManager 中也有三个服务
1: NMLivelineMointor 服务 该服务遍历所有的nodeManager,检测 container 是否挂掉,若contanier挂掉,nodeManager不会重启 container ,只会通过rpc 告诉AM,让AM 决定是否重启
2: nodeListManager 服务
3: resourceTrackerManager 服务
第六部: 为了掌握container运行状态,ApplicationMaster要通过Rpc函数ContainerManagermentProtocol#getContainerStatus向nodeManger 询问 container的运行状态,一旦发现某个container运行失败后,applicationMaster可以尝试为对应的任务申请新的 资源
第七步:一旦一个container运行完成后,applicationMaster 可以通过rpc函数 让nodeMangaer释放container;
第八步:application 时刻检测作业是否完成,若完成;applicationMaster通过RPC函数 applicationMasterProtocol#finishApplicationMaster告诉resourceManager 运行程序接口