YARN总体上采用master/slave架构,其中,ResourceManager为master,NodeManager为slave, ResourceManager负责对各个NodeManager上的资源进行统一管理和调度。当用户提交一个应用程序时,需要提供一个用以跟踪和管理这个程序的ApplicationMaster,它负责向ResourceManager申请资源,并要求NodeManager启动可以占用一定资源的任务,由于不同的ApplicationMaster被分布到不同的节点上,因此它们之间不会相互影响。
1、ResourceManager(RM)
RM是一个全局的资源管理器,负责整个系统的资源管理和分配。它主要由两个组件构成:调度器(Scheduler)和应用管理器(Applications Manager, ASM)。
- 调度器:调度器主要功能是根据资源容量,队列等方面的限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统中的资源分配给各个应用程序。YARN中的调度器是一个“纯调度器”,它不再从事任何与具体应用程序相关的工作,比如不负责监控或者跟踪应用的执行状态等,也不负责重新启动因应用执行失败或者硬件故障而产生的失败任务,这些均交由应用程序相关的ApplicationMaster完成。调度器仅根据各个应用程序的资源需求进行资源分配,而资源分配单位用一个抽象概念“资源容器”(Resource Container,简称Container)表示,Container是一个动态资源分配单位,它将内存、CPU、磁盘、网络等资源封装在一起,从而限定每个任务使用的资源量。在YARN中,资源调度器是一个可插拔的组件,用户可根据自己的需要设计新的调度器,YARN提供了多种直接可用的调度器,比如Fair Scheduler和Capacity Scheduler。
- 应用程序管理器:应用程序管理器负责管理整个系统中的所有应用程序,包括应用程序提交、与调度器协商资源以启动ApplicationMaster、监控ApplicationMaster运行状态并在失败时重新启动它等。
为了避免单个ResourceManager出现单点故障导致整个集群不可用,YARN引入主备ResourceManager实现了HA,当Active ResourceManager出现故障时,Standby ResourceManager会通过ZooKeeper选举,自动提升为Active ResourceManager。
2、ApplicationMaster(AM)
用户提交的每个应用程序均包含一个独立的AM,其主要功能包括:
- 与RM调度器协商以获取资源(用Container表示)。
- 将得到的资源进一步分配给内部的任务。
- 与NM通信以启动/停止任务。
- 监控所有任务的运行状态,并在任务运行失败时重新为任务申请资源以重启任务。
当前YARN源代码中自带了两个AM实现,一个是用于演示AM编写方法的实例程序distributedshell,它可以申请一定数目的Container运行一个shell命令或者shell脚本,另一个是运行MapReduce应用程序的AM——MRAppMaster。很多开源的计算框架和服务为了能够运行在YARN上,也提供了自己的ApplicationMaster实现,包括Open MPI、Spark、HBase、Impala等。
3、NodeManager(NM)
NM是每个节点上的资源管理器,一方面,它会定时地向RM汇报本节点上的资源使用情况和各个Container的运行状态,另一方面,它接收并处理来自AM的任务启动/停止等各种请求。在一个集群中,NodeManager通常存在多个,由于YARN内置了容错机制,单个NodeManager的故障不会对集群中的应用程序运行产生严重影响。
4、Container
Container是YARN中的基本资源分配单位,是对应用程序运行环境的抽象,并为应用程序提供资源隔离环境。它封装了多维度的资源,如内存、CPU、磁盘、网络等,当AM向RM申请资源时,RM为AM返回的资源便是用Container表示的。YARN中每个任务均会对应一个Container,且该任务只能使用该Container中描述的资源。需要注意的是,Container不同于MRv1中的slot,它是一个动态资源划分单位,是根据应用程序的需求动态生成的。Container最终是由ContainerExecutor启动和运行的,YARN提供了三种可选的ContainerExecutor:
- DefaultContainerExecutor:默认ContainerExecutor实现,直接以进程方式启动Container,不提供任何隔离机制和安全机制,任何应用程序最终均是以YARN服务启动者的身份运行的。
- LinuxContainerExecutor:提供了安全和Cgroups隔离的ContainerExecutor,它以应用程序提交者的身份运行Container,且使用Cgroups为Container提供CPU和内存隔离的运行环境。
- DockerContainerExecutor:基于Docker实现的ContainerExecutor,可直接在YARN集群中运行Docker Container。Docker是基于Linux Container技术构建的非常轻量级的虚拟机,目前被广泛应用在服务部署、自动化测试等场景中。