对Hadoop有过了解的都知道,Hadoop经历过很长一段时间的版本号混乱和架构调整,YARN是Hadoop 2.0(或者早期的0.23.x)提出的资源管理、任务调度框架。解决了很多Hadoop 1.0(或者0.21.x、0.22.x)时代的痛点。
随着发展,YARN不仅仅是Hadoop的资源调度框架,还成为一个通用的资源调度管理器,可以将各种各样的计算框架通过YARN管理起来,比如Strom、Spark等。
YARN的基本思想是将资源管理和作业调度/监控的功能分为独立的守护进程。分别是一个全局的 ResourceManager(RM) 和每个应用程序的 ApplicationMaster(AM)。应用程序可以是一个job作业或者一组job作业的有向无环图(DAG)。
ResourceManager负责系统中的所有应用程序的资源分配。NodeManager负责每台机器中容器代理、资源监控(cpu,内存,磁盘,网络),并将这些情况报告给ResourceManager或Scheduler。
每个应用的ApplicationMaster是一个框架特定的库,从ResourceManager协商资源,并与NodeManager共同执行监听任务。
从结构上看,YARN是主/从架构,一个ResourceManager,多个NodeManager,共同构成了数据计算框架。
从上面的结构图来看,YARN主要的组件包括ResourceManager、NodeManager、ApplicationMaster和Container。
1. ResourceManager(RM)
ResourceManager负责整个集群的资源管理和分配,包括处理客户端请求、启动和监控ApplicationMaster、监控NodeManager、资源的分配和调度。
ResourceManager由两个主要组件组成:Scheduler和ApplicationsManager(ASM)。
- Scheduler:Scheduler根据容量、队列等限制条件(每个队列分配多少资源、最多执行多少个作业等),向运行的应用程序分配资源。Scheduler是一个单纯的调度器,不负责监控功能或跟踪应用程序状态。另外,如果因为应用程序错误或硬件故障任务失败,它不保证重新启动任务。这些都交给ApplicationMaster完成。
资源分配单位用一个抽象概念“容器”(Container)表示,容器是一个动态资源分配单位,将诸如内存、cpu、磁盘、网络等资源封装在一起,从而限定每个任务使用的资源量
Scheduler是一个可插拔组件,可以根据自己的需要重新定义。YARN提供了已经实现了多种Scheduler,比如CapacityScheduler和FairScheduler。 - ApplicationsManager:ApplicationsManager负责接收提交的作业,与第一个容器协商来执行应用程序对应的ApplicationMaster,并在容器失败时重启ApplicationMaster。每个应用程序对应的ApplicationMaster负责从Scheduler协商资源容器,并跟踪应用程序状态、监控执行进度。
2. NodeManager(NM)
NodeManager是YARN集群中每个节点上资源和任务管理器,负责当前节点程序的运行、资源的管理和监控。
NodeManager定时向ResourceManager发送本节点资源使用情况、容器运行状态等信息。同时,NodeManager需要执行ResourceManager和ApplicationMaster的命令。
3. ApplicationMaster(AM)
YARN运行的每个应用程序都会有一个ApplicationMaster。负责协调来自ResourceManager的资源,并通过NodeManager监控容器和资源使用(包括内存、CPU等)。
4. YARN工作流程
- 客户端向ResourceManager提交应用程序,其中包括ApplicationMaster、启动ApplicationMaster的命令、用户程序等;
- ResourceManager为该应用程序分配第一个Container,并与对应NodeManager通信,要求它在这个Container中启动应用程序的ApplicationMaster;
- ApplicationMaster向ResourceManager注册自己,启动成功后与ResourceManager保持心跳;
- ApplicationMaster向ResourceManager申请资源;
- 申请资源成功后,由ApplicationMaster进行初始化,然后与NodeManager通信,要求NodeManager启动Container。然后ApplicationMaster与NodeManager保持心跳,从而对NodeManager上运行的任务进行监控和管理;
- Container运行期间,向ApplicationMaster汇报自己的进度和状态信息,以便ApplicationMaster掌握任务运行状态,从而在任务失败是可以重新启动;
- 应用运行结束后,ApplicationMaster向ResourceManager注销自己,允许其所属的Container回收。