Yarn学习
设计思想
作业与资源管理
在学习Yarn之前,我们先学习一下作业管理和资源管理。
在MapReduce中,有一个部件是 JobTracker,它负责作业管理和资源管理
- 作业管理:状态监控、信息汇总、任务调度
- 资源管理:管理主从节点
但是,资源管理和计算框架不能结合得这样紧密(因此这也是MapReduce的一个弊端之一),资源管理应该是由操作系统来分配的,是通用的
而且,MapReduce的作业管理也有缺陷:JobTracker需要维护所有作业的元信息,内存开销大。那么,当同一时刻执行的作业数量增加时, JobTracker与执行这些作业中的任务以及 TaskTracker之间的通信频率增大,造成 JobTracker进程的不稳定。
基于此,我们提出了HADOOP 2.0,其结构如下:也就是将资源管理单独剥离出来,交给Yarn去管理。有了Yarn以后,MapReduce就只需要负责数据处理就好了,而且还可以在此基础上运行Spark、Flink,以实现资源的共享
因此,Yarn从某个角度上来说可以看做是一个操作系统,MapReduce、Spark可以看做是在这个操作系统上的软件。
平台与框架
我们要理清楚平台和框架的区别:
- 平台:具有提供资源功能的系统,如 Yarn,K8s, Mesos
- 框架:运行在平台上的系统,如Spark, Flink, MapReduce
在Yarn这个平台中,管理的粒度是应用。
- 这个应用不一定是是框架中的应用
- 运行在Yarn这个平台上的框架,可以将应用或者作业映射为Yarn的应用。
比如, 在Spark中,一个application 映射成 Yarn中的一个应用。但在MapReduce中,是以Job为单位的,因此一个Job作为Yarn中的一个应用。
体系架构
架构图
Yarn的架构和MapReduce差不多,也是分为主从节点,不过名字换了一下,变成了 Resource Manager和Node Manager。
我们看到上图中有两组不同颜色的工作进程和Application Master。说明此时在Yarn中有两个应用正在工作。
ResourceManager
资源管理器:负责整个系统的资源管理和分配 (全局)。
它分为两部分:
- 资源调度器(Resource Scheduler):分配 Container并进行资源调度
- 应用程序管理器(Application Manager):管理整个系统中运行的所有应用
- 应用程序提交
- 与调度器协商资源以启动ApplicationMaster
- 监控Application Master运行状态
注意:Application Manager并不管理 Application内部的资源如何分配、如何协调。有点像班长,只管小组长是否还工作。关于每个小组如何分工,他不负责
NodeManager
节点管理器:负责每个节点资源和任务管理
- 定时地向ResourceManager汇报本节点的资源使用情况和 Container运行状态
- 接受并处理来自Application Master的Container启动/停止等各 种请求
Application Master
当用户基于Yarn平台提交一个框架应用, Yarn均启动一个 AM用于管理该应用
- AM与RM调度器协商以获取资源(以Container 表示),将获取的资源进一步分配给应用内部的任务
- AM与NM通信以启动/停止任务,监控所有任务运行状态, 并在任务发生故障时重新申请资源来重启任务
container
我们可能已经注意到,前面的AM以及工作进程,进程都被虚线框了起来。这些虚线就是Container
- Container是资源的抽象表示,包含CPU、 内存等资源,是一个动态资源划分单位
- 当AM向RM申请资源时,RM向AM返回以 Container表示的资源
YARN和Mapreduce1.0的对比
- MapReduce 1.0既是计算系统,需要负责作业 管理,也是资源管理系统
- Yarn是独立出来的资源管理系统,而 MapReduce 2.0作为计算系统负责作业管理
Container对应Task并不是特别准确,因为Task是一个进程,Container是容器。因此用child和YarnChild对应更加准确。
执行流程图
当用户向Yarn中提交应用程序之后,Yarn先启动Application Master,再由AM根据应用程序进行任务划分,并为个任务申请资源,同时监控整个运行过程
- 用户编写客户端应用程序,想Yarn提交应用程序
- ResourceManager负责接收和处理来自客户端的请求,尝试为该应用程序分配第一个Container,若分配成功则在这个Container中启动应用程序的Application Master
- Application Master想Resource Manager注册,这样客户端可以通过ResourceManager查看应用的资源使用情况。ApplicationMaster将应用解析为作业并进一步分解为若干任务,并向Resource Manager申请启动这些任务的资源。
- RM想提出的AM分配Container形式表示的资源。一旦AM申请到资源后,在多个任务之间进行分配
- AM确定资源分配方案后,便于对应的NodeManager通信,在相应的Container中启动相应的工作进程用于执行任务
- 各个任务向AM汇报自己的状态和进度,以便让AM随时掌握各个任务的运行状态
- 随着任务执行结束,AM逐步释放所占用的资源,最终向RM注销并关闭自己
工作原理
单平台多框架
Yarn 其实就是一个资源管理的平台,其上可以运行多个框架,并为多个应用进行资源的分配。比如说,在Yarn上可以运行MapReduce、Spark、Flink等应用,而且能实现动态共享物力资源。对于Yarn阿狸说,它值负责想框架提供Container,而不关心在Container中运行何种任务。
如下图,Yarn中部署了MR和Spark两个计算框架,并且提交了两个MapReduce应用和一个Spark应用。由此看出,每当提交了一个应用,Yarn都会启动一个对应的AM(即使是同一类型的应用)。这就说明Yarn是按照应用粒度来划分的,每个应用之间相互独立地控制执行的目的。
平台资源分配
- Resource Manager中的调度器维护了一个 或多个应用队列(queue) ,每个队列拥有一定量的资源,位于同一队列中的应用共享该队列所拥有的资源。
- Yarn进行资源分配对象是应用,用户提交 的每个应用会分配到其中一个队列当中, 而队列决定了该应用能使用的资源上限。
- 资源调度实际上是决定如何将资源分配给队列、以及如何分配给队列中应用的过程
资源分配策略-FIFO
FIFO调度器只维护一个队列,该队列拥有集群中所有资源,调度器的资源分配方式是先提交的应用先得到资源
该调度器实现起来比较简单,但是很可能导致一个应用独占所有的资源,而其他资源需不断等待。
资源分配策略-Capacity
改进FIFO调度器的思想是将一个队列分解为多个队列,每个队列都拥有一定的资源。某一应用最多只会占用其中一个队列所拥有的资源,而不会占用集群中的所有资源。
因此进化成了 Capacity 策略:Capacity Scheduler维护了层级式队列,集群中的资源划分给了这些队列,队列内部的资源分配方式是FIFO
资源分配策略-Fair
改进Capacity调度器的思想是容许队列之间共享资源,从而避免浪费。因此提出了Fair Scheduler, Fair Scheduler维护层级式的队列,集群中的资源划分给这些队列,但是这些队列可以共享资源,因而这些队列逻辑上可以看作是一个共享队列
当然这种方法也有弊端,应用2在提交之后需要和应用1抢占资源,因此会导致一定的时间延迟
容错机制
YARN中的故障主要分为四部分:
- Resource Manager故障
- Node Manager故障
- Application Master故障:重启
- Container中的任务故障:重启
由于AM和Container中运行的任务与具体框架相关,作为资源管理平台的Yarn在它们发生故障的情况下只能重启来恢复
RM故障
- 如果Resource Manager发生故障,那么它 在进行故障恢复时需要从某一持久化存储 系统中恢复状态信息,所有应用将会重新执行
- 我们可以部署多个Resource Manager并通过ZooKeeper进行协调,从而保证 Resource Manager的高可用性
NM故障
Resource Manager认为Node Manager所在节点上所有容器运行的任务也都执行失 败,并把执行失败的信息告诉Application Master
- AM将向RM重新申请资源运行这些任务
RM将分配其它节点的Container执行这些任务
如果发生故障的Node Manager进行恢复, 那么它将向Resource Manager重新注册,重置本地的状态信息