一、什么是Yarn
Yarn是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。
二、Yarn的基本架构
YARN主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成。看一张官网上的架构图:
由图可以看出,yarn总体上是master/slaver结构,在整个资源管理框架中ResourceManager为master,NodeManager为slaver。
另外我在其他文章中看到另外一张图:
1.ResourceManager
ResourceManager是全局的资源管理器,它是Master上一个独立运行的进程,负责集群统一的资源管理、调度、分配等。
根据功能不同将它分为两个组件:Scheduler(调度器)和 ApplicationManager(应用管理器)。
(1)Scheduler
Scheduler根据集群中容量、队列和资源等限制,将资源分配给各个正在运行的应用。虽然被称为调度器,但是它仅负责资源的分配,而不负责监控各个应用的执行情况和任务失败、应用失败或者硬件失败时的重启任务。Scheduler根据各个应用的资源需求和集群各个节点的容器(Container)进行调度。
在yarn中有三种调度器:FIFO Scheduler ,Capacity Scheduler,FairS cheduler。
(2)ApplicationManager
ApplicationManager主要负责接收job的提交请求,为应用程序分配用来运行ApplicationMaster的第一个Container,并且负责监控ApplicationMaster,在ApplicationMaster失败时负责重启运行ApplicationMaster的Container。
总的来说,ResourceManager的主要作用为:
- 处理客服端请求
- 监控NodeManager
- 启动或监控ApplicationMaster
- 资源的分配和调度
2.NodeManager
NodeManager(节点管理器)整个集群有多个,负责单个节点上的资源管理,当一个节点启动时,NodeManager会向ResourceManager进行注册并告知ResourceManager自己有多少资源可用。它负责接收ResourceManager的资源分配请求,分配具体的Container给应用,并监控和报告节点中Container的运行状态(CPU、内存、硬盘等)到ResourceManager;管理每个Container的声明周期,NodeManager只负责管理自身的Container,它并不知道运行在它上面的应用信息,负责管理应用信息的组件是ApplicationMaster。
NodeManager由Container和ApplicationMaster两个组件组成:
(1)Container
Container是集群节点将自身内存、CPU、磁盘、网络等资源封装在一起的抽象概念,是yarn框架的计算单元,是具体执行应用task(如mapTask、reduceTask)的基本单位。Container和集群节点的关系是:一个几点会运行多个Container,但一个Container不会跨节点运行。Container由NodeManager监控运行状态,并上报到ResourceManager,由ResourceManager调度。
(2)ApplicationMaster
每一个应用程序从ApplicationMaster开始,它本身就是一个Container(第0个),一旦启动,ApplicationMaster就会根据任务需求,与ResourceManager协商需要的Container,在运行过程中动态释放和申请Container。
ApplicationMaster负责与scheduler协商合适的container,跟踪应用程序的状态,以及监控它们的进度,ApplicationMaster是协调集群中应用程序执行的进程。每个应用程序都有自己的ApplicationMaster,负责与ResourceManager协商资源(container)和NodeManager协同工作来执行和监控任务 。当一个ApplicationMaster启动后,会周期性的向resourcemanager发送心跳报告来确认其健康和所需的资源情况。
总的来说,NodeManager主要功能为:
- 管理单个节点上的资源
- 处理来自ResourceManager的命令(为应用分配Container)
- 处理来自ApplicationMaster的命令
三、工作机制/作业提交流程
以一个MR的程序为例,了解一下yarn的工作机制及Job的提交流程:
作业提交全过程详解
1、作业提交
第1步:client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。
第2步:client向ResourceManager申请一个Application。
第3步:ResourceManager给client返回该job资源的提交路径和applicationId。
第4步:client提交jar包、切片信息和配置文件到3返回的指定资源提交路径。
第5步:client提交完资源后,向ResourceManager申请运行ApplicationMaster。
2、 作业初始化
第6步:当ResourceManager收到client的请求后,将该job初始化成Task添加到调度器中。
第7步:某一个空闲的NodeManager领取到该job。
第8步:该ResourceManager创建Container,并产生ApplicationMaster。
第9步:下载client提交的资源到本地。
3、任务分配
第10步:ApplicationMaster向ResourceManager申请运行多个maptask任务资源。
第11步:ResourceManager将运行maptask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。
4、任务运行
第12步:ApplicationMaster向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动maptask,maptask对数据分区排序。
第13步:ApplicationMaster等待所有maptask运行完毕后,向ResourceManager申请容器,运行reduce task。
第14步:reduce task向maptask获取相应分区的数据。
第15步:程序运行完毕后,MR会向ResourceManager申请注销自己。