YARN是传统的主从(master/slave)架构,如下图所示
YARN服务由ResourceManager和NodeManager两类进程组成,Container是YARN的资源表示模型,在任何类型的计算框架的作业都可以运行在Container中,ApplicationMaster是YARN的二级资源调度器,它也运行在Container中。
1. ResourceManager
YARN的资源调度模型属于双层调度器,而ResourceManager属于双层调度中的中央调度器,是集群中所有资源的管理者,负责集群中所有资源管理和调度。它会定期接受各个NodeManager的资源汇报信息,并进行汇总,并根据资源使用情况将资源分配给各个应用的二级调度器(ApplicationMaster)。
为了更好的理解ResourceManager的运行机制,下面看看ResourceManager内部的架构图
下面结合ResourceManager的功能,对一些关键模块进行简单的讲解:
- Yarn Scheduler:Yarn Scheduler负责给正在运行的应用程序分配资源,它给予应用程序的资源申请来执行资源调度(CPU和内存),它详单与双层调度器的主调度器。
- ApplicationManager:其负责管理已提交的应用的 集合,在应用提交后,首先检查ApplicationMaster资源请求的合法性,然后确定没有其他已提交的应用已经使用了相同的ID。
- ApplicationMaster Service:该组件相应来自所有ApplicationMaster的请求,它可以注册新的ApplicationMaster,接受来自任意正在结束的ApplicationMaster的终止或取消注册请求,认证来自不同ApplicationMaster的所有请求,确保只有合法的ApplicationMaster发送的请求传递给ResourceManager中的应用程序对象,获取所有来自所有运行ApplicationMaster的Container的分配和释放请求,异步的转发给yarn调度器。ApplicationMaster Service有额外的逻辑来保证任意时刻只有任意ApplicationMaster只有一个线程可以发送请求给ResourceManager。在ResourceManager上来自ApplicationMaster的RPC被串行化了,这也是主调度器悲观并发的原因。
- Resource Tracker Service:上面两个模块主要负责与ApplicationMaster打交道,这个模块负责与NodeManager打交道。NodeManager会周期性的发送心跳给ResourceManager的Resource Tracker Service,该组件负责响应来自所有节点的RPC请求,它具体负责注册新节点,接受前面注册节点的心跳,确保只有合法的节点可以和ResourceManager通信,拒绝其他不合法节点。
2. NodeManager
NodeManager是YARN集群中单个节点的代理,管理YARN集群中单个计算节点,它负责保持与ResourceManager的同步,跟踪节点的健康状况,管理各个Container的生命周期,监控每个Container资源使用情况,管理分布式缓存,管理各个Container生成的日志,提供不同yarn应用可能需要的辅助服务,其中,Container的管理是NodeManager的核心功能。
下面是NodeManager的架构图:
下面对关键模块进行讲解:
- NodeStatusUpdater:负责NodeManager和ResourceManager交互,在NodeManager启动时,NodeStatusUpdater回向ResourceManager注册,并发送该节点的可用资源信息,同事还会完成安全方面的认证。在之后的NodeManager与ResourceManager通信的过程中,NodeStatusUpdater会周期性的汇报该节点正在运行的Container信息,状态跟新信息,已完成的Container信息,ApplicationMaster新启动的Container信息。ResourceManager也可已通过该组件通知销毁正在运行的Container,当ResourceManager上面的应用结束后,ResourceManager会向NodeManager发送信号,命令开始清理该应用占用的资源,然后开始日志聚合。
- ContainerManager:是NodeManager最核心的组件,他有许多子组件构成,每个子组件负责一部分功能,以管理运行在该节点上的所有Container
- RPC Server:是ApplicationMaster与NodeManager通信的唯一通道。通过RPC Server, ContainerManager从各个ApplicationMaster上接收RPC请求以启动Container或者停止正在运行的Container。
- ResourceLocalizationService:资源本地化服务,负责Container所需资源的本地化,它能够按照正确的URI从HDFS上下载所需资源。
- ContainersLauncher:该组件维护了一个线程池来并行完成对Container的相关操作,例如启停Container。 - **ContainersMonito**r:监控Container的资源使用量。为了实现资源隔离和公平共享,RM为每个Container分配了一定量的资源。ContainersMonitor持续监控每个Container的利用率,一旦一个Container超出了它的允许使用份额,它将向Container发送信号将其杀掉,这可以避免失控的Container影响了同节点上其他正在运行的Container。
3. ApplicationMaster
他是YARN中比较特殊的组件,生命周期随着应用的开始而开始,结束而结束,每个应用对应一个ApplicationMaster。
他负责向ResourceManager申请资源,在对应的NodeManager上启动Container来执行任务,并在应用中不断监控这些Container的状态。
ApplicationMaster的启动是由ResourceManager完成的。当作业被提交后,ResourceManager会在集群中任选一个Container启动作为ApplicationMaster。
4. YARN的资源表示模型Container
YARN的Container模型,对不同计算框架是无差别对待的(比MR模型好很多)。在资源分配上,Container将按照二级调度器申请的大小来按需分配资源,从而大大减少了资源浪费。