YARN是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序。
Yarn是Hadoop2.x版本中的一个新特性。它的出现其实是为了解决第一代MapReduce编程框架的不足,提高集群环境下的资源利用率,这些资源包括内存,磁盘,网络,IO等。Hadoop2.x版本中重新设计的这个Yarn集群,具有更好的扩展性,可用性,可靠性,向后兼容性,以及能支持除MapReduce以外的更多分布式计算程序。
(1)Yarn并不清楚用户提交的程序的运行机制
(2)Yarn只提供运算资源的调度(用户程序向Yarn申请资源,Yarn就负责分配资源)
(3)Yarn中的主管角色叫 ResourceManager
(4)Yarn中具体提供运算资源的角色叫 NodeManager
(5)这样一来,Yarn其实就与运行的用户程序完全解耦,就意味着Yarn上可以运行各种类型的分布式运算程序(MapReduce只是其中一种)比如 MapReduce、Storm程序,Spark程序,TEZ .......
(6)所以,Spark、Storm等运算框架都可以整合在Yarn上运行,只要它们各自的框架中有符合Yarn规范的资源请求机制即可。
(7)Yarn就成为一个通用的资源调度平台,从此,企业中以前存在的各种运算集群都可以整合在一个屋里集群上,提高资源利用率,方便数据共享。
(1)JobTracker 是集群事物的几种处理点,存在单点故障
(2)JobTracker 需要完成的任务太多,既要维护 job 的状态,又要维护 job 的task 的状态,造成过多的资源消耗
(3)在TaskTracker端,用Map/Reduce Task作为资源便是过于简单,没有考虑到CPU、内存等资源情况,当把两个需要消耗大内存的Task调度到一起,很容易出现OOM。
(4)把资源强制划分为Map/Reduce Slot,当只有MapTask时,TeduceSlot不能用;当只有Reduce Task时,MapSlot不能用,容易造成资源利用不足。
总结起来就是:
1、扩展性差
2、可靠性差
3、资源利用率低
4、不支持多种计算框架
Yarn/MRv2最基本的想法是将原JobTracker主要的资源管理器和Job调度/监视功能分开作为两个单独的守护进程。有一个全局的 ResourceManger(RM)和每个 Application 有一个 ApplicationMaster(AM),Application 相当于MapReduce Job 或者 DAG jobs。ResourceManager 和 NodeManager (NM)组成了基本的数据计算框架。
ResourceManager 协调集群的资源利用,任何Client 或者运行着得ApplicationMaster 想要运行Job 或者Task都的向 RM 申请一定的资源。ApplicationMaster 是一个框架特殊的库,对于MapReduce 框架而言有它自己的 AM 实现, 用户也可以实现自己的AM,在运行的时候,AM会与 NM 一起来启动和监视 Tasks。
ResourceManager是基于应用程序对集群资源的需求进行调度的Yarn集群主控节点,负责协调和管理整个集群(所有 NodeManager)的资源,响应用户提交的不同类型应用的 解析,调度,监控等工作。
ResourceManager 会为每一个Application 启动一个MRAppMaster,并且MRAppMaster 分散在各个NodeManager节点
它主要由两个组件构成:调度器(Scheduler)和应用程序管理器(ApplicationsManager,ASM)
Yarn集群的主节点 ResourceManager的职责:
1、处理客户端请求
2、启动或监控 MRAppMaster
3、监控 NodeManager
4、资源的分配与调度
NodeManager 是 Yarn 集群当中真正资源的提供者,是真正执行应用程序的容器的提供者,监控应用程序的资源使用情况(CPU,内存,硬盘,网络),并通过心跳向集群资源调度器 ResourceManager 进行汇报以更新自己的健康状态,管理日志和不同应用程序用到的附属服务(auxiliary service)。
Yarn集群的从节点 NodeManager 的职责:
1、管理单个节点上的资源
2、处理来自 ResourceManager 的命令
3、处理来自 MRAppMaster 的命令
MRAppMaster对应一个应用程序,职责是:向资源调度器申请执行任务的资源容器,运行任务,监控整个任务的执行,跟踪整个任务的状态,处理任务失败及异常情况。
Container 容器是一个抽象出来的逻辑资源单位。容器是由 ResourceManager Scheduler 服务动态分配资源构成,它包括了该节点上的一定量CPU,内存,磁盘,网络等信息,MapReduce 程序的所有 Task 都是在一个容器里执行完成的,容器的大小是可以动态调整的。
应用程序管理器 ASM 负责管理整个系统中所有应用程序,包括应用程序提交,与调度器协商资源以启动MRAppMaster、监控MRAppmaster 运行状态并在失败时重新启动它,等等
调度器根据应用程序的资源需求进行资源分配,不参与应用程序具体的执行和监控等工作,资源分配的单位就是Container,调度器是一个可插拔的组件,用户可以根据自己的需求实现自己的调度器。Yarn本身为我们提供了多种直接可用的调度器,FIFO,Fair,Scheduler 和 Capacity Scheduler 等。
Yarn作业执行流程
1、用户向 Yarn 中提交应用程序,其实包括 MRAppMaster 程序,启动 MRAppMaster 的命令,用户程序等。
2、ResourceManager 为该程序分配第一个 Container ,并与对应的 NodeManager 通讯,要求它在这个Container 中启动应用程序 MRAppMaster。
3、MRAppMaster 首先向 ResourceManager 注册,这样用户可以直接通过 RescourceManager 查看应用程序的运行状态,然后将为各个人物申请资源,并监控它的运行状态,直到运行结束,重复 4 到 7 的步骤。
4、MRAppMaster 采用轮询的方式通过 RPC 协议向 ResourceManager 申请和领取资源。
5、一旦 MRAppMaster 申请到资源后,便与对应的NodeManager 通讯,要求它启动任务。
6、NodeManager 为人物设置好运行环境(包括环境变量,Jar包,二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行改脚本启动任务。
7、各个人物通过某个 RPC 协议向 MRAppMaster 汇报自己的状态和进度,以让 MRAppMaster 随时掌握各个任务的运行状态,从而可以在任务失败的时候重新启动任务。
8、应用程序运行完成后,MRAppMaster 向 ResourceManager 注销并关闭自己。