YARN集群总体上是经典的主/从(Master/Slave)架构,主要由ResourceManager、NodeManager、Task、Container和ApplicationMaster等组件构成。YARN集群架构如图3-4所示。
图3-4 YARN集群架构
各个组件的解析如下。
ResourceManager以后台进程的形式运行,负责对集群资源进行统一管理和任务调度。ResourceManager的主要职责如下:
·接收来自客户端的请求。
·启动和管理各个应用程序的ApplicationMaster。
·接收来自ApplicationMaster的资源申请,并为其分配Container。
·管理NodeManager,接收来自NodeManager的资源和节点健康情况汇报。
NodeManager是集群中每个节点上的资源和任务管理器,以后台进程的形式运行。它会定时向ResourceManager汇报本节点上的资源(内存、CPU)使用情况和各个Container的运行状态,同时会接收并处理来自ApplicationMaster的Container启动/停止等请求。NodeManager不会监视任务,它仅监视Container中的资源使用情况。例如,如果一个Container消耗的内存比最初分配得更多,就会结束该Container。
Task是应用程序的具体执行任务。一个应用程序可能有多个任务,如一个MapReduce程序可以有多个Map任务和多个Reduce任务(本书第5章会对MapReduce进行详细讲解)。
Container是YARN中资源分配的基本单位,是封装了CPU和内存资源的一个容器,相当于一个Task运行环境的抽象。从实现上看,Container是一个Java抽象类,定义了资源信息。应用程序的Task将会被发布到Container中运行,从而限定了Task使用的资源量。Container类的部分源码如下:
从上述代码中可以看出,Container类中定义的一个重要属性类型是Resource。Resource类也是一个抽象类,其中定义了内存和CPU核心数,该类的部分源码如下:
Container的大小取决于它所包含的资源量。一个节点上的Container数量,由节点空闲资源总量(总CPU数和总内存)决定。
在YARN的NodeManager节点上有许多动态创建的Container。NodeManager会将计算机的CPU和内存的一定值抽离成虚拟的值,然后将这些虚拟的值根据配置组成多个Container,当应用程序提出申请时,就会对其分配相应的Container。
此外,一个应用程序所需的Container分为两类:运行ApplicationMaster的Container和运行各类Task的Container。前者由ResourceManager向内部的资源调度器申请和启动,后者由ApplicationMaster向ResourceManager申请,并由ApplicationMaster请求NodeManager进行启动。
我们可以将Container类比成数据库连接池中的连接,需要的时候进行申请,使用完毕后进行释放,而不需要每次独自创建。
ApplicationMaster即应用程序管理者,主要负责应用程序的管理,以后台进程的形式运行。它为应用程序向ResourceManager申请资源(CPU、内存),并将资源分配给所管理的应用程序的Task。
一个应用程序对应一个ApplicationMaster。例如,一个MapReduce应用程序会对应一个ApplicationMaster(MapReduce应用程序运行时,会在NodeManager节点上启动一个名为MRAppMaster的进程,该进程则是MapReduce的ApplicationMaster实现);一个Spark应用程序也会对应一个ApplicationMaster。
在用户提交一个应用程序时,会启动一个ApplicationMaster实例,ApplicationMaster会启动所有需要的Task来完成它负责的应用程序,并且监视Task运行状态和运行进度、重新启动失败的Task等。应用程序完成后,ApplicationMaster会关闭并释放自己的Container,以便其他应用程序的ApplicationMaster或Task转移至该Container中运行,提高资源利用率。
ApplicationMaster自身和应用程序的Task都在Container中运行。
ApplicationMaster可在Container内运行任何类型的Task。例如,MapReduce ApplicationMaster请求一个容器来启动Map Task或Reduce Task。也可以实现一个自定义的ApplicationMaster来运行特定的Task,以便任何分布式框架都可以受到YARN的支持,只要实现了相应的ApplicationMaster即可。
总结来说,我们可以这样认为:ResourceManager管理整个集群,NodeManager管理集群中单个节点,ApplicationMaster管理单个应用程序(集群中可能同时有多个应用程序在运行,每个应用程序都有各自的ApplicationMaster)。