前言
任何计算任务的运行都离不开计算资源,比如 CPU、内存等,那么如何对于计算资源的管理调度就成为了一个重点。大数据领域中的 Hadoop 之所以一家独大,深受市场的欢迎,和他们设计了一个通用的资源管理调度平台 Yarn 密不可分,那 Yarn 是如何做进行资源管理的呢?它的通用性体现在哪里呢?它是如何保证 Hadoop 绝对的统治地位的呢?希望看了本文你心中有了答案。
YARN 简介
在早期的 Hadoop 1.0 时代是没有 Yarn 这东西的,计算任务 MapReduce 程序分发到大数据集群中是通过 TaskTracker
和 JobTracker
通信来完成,这有一个很大的缺点就是服务器集群资源调度管理和 MapReduce 执行过程耦合在一起,如果想在当前集群中运行其他计算任务,比如 Spark 或者 Storm,就无法统一使用集群中的资源了。后来聪明的 Hadoop 设计者们想能否将资源管理和计算任务分开,也可以运行别家公司的计算任务呢,这也是 Hadoop 2 最主要的变化,就是将 Yarn 从 MapReduce 中分离出来,成为一个独立的资源调度框架。
Apache Hadoop YARN
(Yet Another Resource Negotiator
,另一种资源协调者)是一种新的 Hadoop 资源管理器。YARN 是一个通用资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度。它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。
那么如何理解 YARN 是一个通用资源管理系统和调度平台?
-
资源管理系统:能够管理集群的硬件资源,和程序运行相关,比如内存、CPU 等。
-
调度平台:多个程序同时申请计算资源如何分配,调度的规则(算法)是什么呢。
-
通用:不仅仅支持 MapReduce 程序,理论上支持各种计算程序。YARN 不关心你干什么,只关心你要资源,在有的情况下给你,用完之后还我。
可以把 Hadoop YARN 理解为相当于一个分布式的操作系统平台,而 MapReduce 等计算程序则相当于运行于操作系统之上的应用程序,YARN 为这些程序提供运算所需的资源(内存、CPU 等)。 Hadoop 能有今天这个地位,YARN 可以说是功不可没。因为有了 YARN ,更多计算框架可以接入到 HDFS 中,而不单单是 MapReduce,正是因为 YARN 的包容,使得其他计算框架能专注于计算性能的提升。
YARN 架构和执行流程
从图上看,Yarn 包括两个部分:一个是资源管理器(Resource Manager),一个是节点管理器(Node Manager)。
-
ResourceManager(RM)
YARN 集群中的主角色,决定系统中所有应用程序之间资源分配的最终权限,即最终仲裁者。接收用户的作业提交,并通过 NM 分配、管理各个机器上的计算资源。
-
NodeManager(NM)
YARN 中的从角色,一台机器上一个,负责管理本机器上的计算资源。
根据 RM 命令,启动 Container 容器、监视容器的资源使用情况。并且向 RM 主角色汇报资源使用情况。
Yarn 进行资源分配的单位是容器(Container
),每个容器包含了一定量的内存、CPU 等计算资源,默认配置下,每个容器包含一个 CPU 核心。容器由 NodeManager 进程启动和管理,NodeManger 进程会监控本节点上容器的运行状况并向 ResourceManger 进程汇报。
应用程序管理器负责应用程序的提交、监控应用程序运行状态等。应用程序启动后需要在集群中运行一个 ApplicationMaster
,ApplicationMaster
也需要运行在容器里面。每个应用程序启动后都会先启动自己的 ApplicationMaster
,由 ApplicationMaster
根据应用程序的资源需求进一步向 ResourceManager
进程申请容器资源,得到容器以后就会分发自己的应用程序代码到容器上启动,进而开始分布式计算。
我们以一个 MapReduce 程序为例,来看一下 Yarn 的整个工作流程。
-
我们向 Yarn 提交应用程序,包括
MapReduce ApplicationMaster
、我们的MapReduce
程序,以及MapReduce Application
启动命令。
2.ResourceManager
进程和 NodeManager
进程通信,根据集群资源,为用户程序分配第一个容器,并将 MapReduce ApplicationMaster
分发到这个容器上面,并在容器里面启动 MapReduce ApplicationMaster
。
3.MapReduce ApplicationMaster
启动后立即向 ResourceManager
进程注册,并为自己的应用程序申请容器资源。
4.MapReduce ApplicationMaster
申请到需要的容器后,立即和相应的 NodeManager
进程通信,将用户 MapReduce
程序分发到 NodeManager
进程所在服务器,并在容器中运行,运行的就是 Map 或者 Reduce 任务。
5.Map 或者 Reduce 任务在运行期和 MapReduce ApplicationMaster
通信,汇报自己的运行状态,如果运行结束,MapReduce ApplicationMaster
向 ResourceManager
进程注销并释放所有的容器资源。
YARN 资源调度器 Scheduler
YARN 还有一个作用就是进行资源调度,那么如何理解资源调度?
-
在理想情况下,应用程序提出的请求将立即得到 YARN 批准。但是实际中,资源是有限的,并且在繁忙的群集上,应用程序通常将需要等待其某些请求得到满足。YARN 调度程序的工作是根据一些定义的策略为应用程序分配资源。
-
在 YARN 中,负责给应用分配资源的就是
Scheduler
,它是ResourceManager
的核心组件之一。Scheduler
完全专用于调度作业,它无法跟踪应用程序的状态。 -
一般而言,调度是一个难题,并且没有一个“最佳”策略,为此,YARN 提供了多种调度器和可配置的策略供选择。
三种调度器策略
Yarn 中提供了三种调度器,FIFO Scheduler
(先进先出调度器)、Capacity Scheduler
(容量调度器)、Fair Scheduler
(公平调度器)。Apache 版本 YARN 默认使用Capacity Scheduler
。
FIFO Scheduler
FIFO Scheduler
是一个先进先出的思想,即先提交的应用先运行。调度工作不考虑优先级和范围,适用于负载较低的小规模集群。当使用大型共享集群时,它的效率较低且会导致一些问题。
FIFO Scheduler
拥有一个控制全局的队列 queue,默认 queue 名称为 default,该调度器会获取当前集群上所有的资源信息作用于这个全局的 queue。
优势:
-
无需配置、先到先得、易于执行
坏处:
-
任务的优先级不会变高,因此高优先级的作业需要等待
-
不适合共享集群
Capacity Scheduler
Capacity Scheduler
容量调度是 Apache Hadoop3.x 默认调度策略。该策略允许多个组织共享整个集群资源,每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。
Capacity
可以理解成一个个的资源队列,这个资源队列是用户自己去分配的。队列内部又可以垂直划分,这样一个组织内部的多个成员就可以共享这个队列资源了,在一个队列内部,资源的调度是采用的是先进先出(FIFO)策略。
优势
-
层次化的队列设计(Hierarchical Queues)
层次化的管理,可以更容易、更合理分配和限制资源的使用。
-
容量保证(Capacity Guarantees)
每个队列上都可以设置一个资源的占比,保证每个队列都不会占用整个集群的资源。
-
安全(Security)
每个队列有严格的访问控制。用户只能向自己的队列里面提交任务,而且不能修改或者访问其他队列的任务。
-
弹性分配(Elasticity)
空闲的资源可以被分配给任何队列。 当多个队列出现争用的时候,则会按照权重比例进行平衡。
Fair Scheduler
Fair Scheduler 叫做公平调度,提供了 YARN 应用程序公平地共享大型集群中资源的另一种方式。使所有应用在平均情况下随着时间的流逝可以获得相等的资源份额。
Fair Scheduler 设计目标是为所有的应用分配公平的资源(对公平的定义通过参数来设置)。
公平调度可以在多个队列间工作,允许资源共享和抢占。
如何理解公平共享?
-
有两个用户 A 和 B,每个用户都有自己的队列。
-
A 启动一个作业,由于没有 B 的需求,它分配了集群所有可用的资源。
-
然后 B 在 A 的作业仍在运行时启动了一个作业,经过一段时间,A,B 各自作业都使用了一半的资源。
-
现在,如果 B 用户在其他作业仍在运行时开始第二个作业,它将与 B 的另一个作业共享其资源,因此 B 的每个作业将拥有资源的四分之一,而 A 的继续将拥有一半的资源。结果是资源在用户之间公平地共享。
优势
-
分层队列:队列可以按层次结构排列以划分资源,并可以配置权重以按特定比例共享集群。
-
基于用户或组的队列映射:可以根据提交任务的用户名或组来分配队列。如果任务指定了一个队列,则在该队列中提交任务。
-
资源抢占:根据应用的配置,抢占和分配资源可以是友好的或是强制的。默认不启用资源抢占
-
保证最小配额:可以设置队列最小资源,允许将保证的最小份额分配给队列,保证用户可以启动任务。当队列不能满足最小资源时,可以从其它队列抢占。当队列资源使用不完时,可以给其它队列使用。这对于确保某些用户、组或生产应用始终获得足够的资源。
-
允许资源共享:即当一个应用运行时,如果其它队列没有任务执行,则可以使用其它队列,当其它队列有应用需要资源时再将占用的队列释放出来。所有的应用都从资源队列中分配资源。
-
默认不限制每个队列和用户可以同时运行应用的数量。可以配置来限制队列和用户并行执行的应用数量。限制并行执行应用数量不会导致任务提交失败,超出的应用会在队列中等待。
总结
Yarn 作为一个通用的资源管理平台,简单总结有两大块功能,一个是为计算任务分配 CPU、内存等计算资源,另外一个是计算任务该什么时候调度运行。但是它的格局更大,只要实现 Yarn 提供的编程规范,不仅能运行自己 Hadoop 的 MapReduce 计算任务,还可以运行其他比如 Spark、Flink 等其他产品的计算任务。所以这是一个非常优秀的平台,或者说框架。