资源模型和container
yarn将服务资源进行抽象的封装,它使用container对象代表申请资源的基本单元.
这些资源包括资源名称(服务名称,机架等),内存和CPU
yarn通过container机制将服务器资源进行了隔离.
每个ApplicationMaster向ResourceManager申请资源,当ApplicationMaster向ResourceManager申请资源时,ResourceManger返回的资源使用Container的个数来表示,比如一个spark计算任务需要5个container资源
ResourceManager
ResourceManager是一个全局的资源管理器,负责整个系统的资源管理和分配以保证整个集群的高效运行.
它会根据容量,队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统的资源分配给各个正在运行的应用程序.
只负责根据各个应用程序的资源请求进行资源分配,不参与任何与具体应用程序相关的工作,比如不负责监控或者跟踪应用的执行状态等,也不负责重新启动因应用执行失败或硬件故障而产生的失败任务,这些均交由应用程序相关的ApplicationMaster完成.
资源分配管理单位用的是我们刚才介绍过的container对象.
此外,ResourceManager还支持一个可插拔的调度器插件来支持多种资源调度策略,比如使用公平调度或者容量调度
ApplicationMaster
每个想要运行在YARN上的应用都必须有一个相应的ApplicationMaster实现
应用将内部的任务调度逻辑和监控都交由它们自己的ApplicationMaster实现类来处理.
ApplicationMaster是YARN的一个创新设计,YARN通过这种机制将自己打造成了一个扩展性极强的通用资源调度框架,因为他允许用户开发自己的ApplicationMaster实现
ApplicationMaster进程在运行的过程中主要负责与ResourceManager进行通信,以申请执行任务时所需要的资源,在申请到资源后再进一步执行自身内部的调度任务.
同时,ApplicationMaster也负责监控自己运行的内部任务状态,在任务失败的时候重新为任务申请相应资源并重启任务
ApplicationMaster通常作为一个应用的主进程,主要用来扮演拆分子任务,汇总结果数据在这类的总体调度,比如spark的Driver进程.而真正的执行程序业务逻辑的进程是在NodeManager进程上执行的
NodeManager
NodeManager是每个服务器节点上资源管理器,负责管理自己所处服务器Containers的整体生命周期.
在yarn上运行的应用最终的逻辑执行程序(比如spark的task,mapreduce的job)都会在NodeManager的Container中运行,可以说NodeManager是yarn的计算节点的代理,因为ResourceManager只会将任务分配到启动了NodeManager进程的服务器
当NodeManager进程启动的时候,它会向ResourceManager进行注册,并定时汇报自己所在服务器的资源使用情况和container运行状态,同时它也接受并处理来自ApplicationMaster的Container启动和停止等各种请求
单一集群架构
ResourceManager,NodeManager和Container组件都不关心具体的应用程序或任务的类型,只有ApplicationMaster才是应用类型相关的
Yarn通过使用开放ApplicationMaster的集成方式,允许第三方应用框架便捷的和YARN进行集成.
这才有了像MapReduce on Yarn, Storm on YARN, Spark on Yarn和Tez on Yarn等众多第三方应用集成方案出现
通过这种资源共享的单一集群架构,可以实现服务器资源真正的共享使用,以达到降低技术集成成本和增强资源整体利用率的目的
工作流程
- 用户向Yarn提交应用程序
- ResourceManager为该应用程序找到一个可用的NodeManager并分配第一个Container.然后在这个Container中启动应用程序的ApplicationMaster
- ApplicationMaster向ResourceManager进行注册,这样用户就可以通过ResourceManager查看应用程序的运行状态并对任务进行监控
- ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请和领取资源
- ApplicationMaster申请到资源后与对应的NodeManager通信,要求它启动Container并为任务设置好运行环境
- 应用程序的任务开始在启动的Container中运行,各个任务向ApplicationMaster汇报自己的状态和进度,以便ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动
- 应用程序在运行的过程中,客户端通过轮询的方式主动与ApplicationMaster通信以获得应用的运行状态,执行进度等信息
- 应用程序运行完成后,ApplicationMaster向ResourceManager注销并关闭自己