任何计算任务的运行都离不开计算资源,比如CPU、内存等,那么如何对于计算资源的管理调度就成为了一个重点。大数据领域中的Hadoop之所以一家独大,深受市场的欢迎,和他们设计了一个通用的资源管理调度平台Yarn密不可分,那Yarn是如何做进行资源管理的呢?它的通用性体现在哪里呢?它是如何保证Hadoop绝对的统治地位的呢?希望看了本文你心中有了答案。
在早期的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是一个通用资源管理系统和调度平台?
可以把Hadoop YARN理解为相当于一个分布式的操作系统平台,而MapReduce等计算程序则相当于运行于操作系统之上的应用程序,YARN为这些程序提供运算所需的资源(内存、CPU等)。 Hadoop能有今天这个地位,YARN可以说是功不可没。因为有了YARN ,更多计算框架可以接入到 HDFS中,而不单单是 MapReduce,正是因为YARN的包容,使得其他计算框架能专注于计算性能的提升。
从图上看,Yarn 包括两个部分:一个是资源管理器(Resource Manager),一个是节点管理器(Node Manager)。
YARN集群中的主角色,决定系统中所有应用程序之间资源分配的最终权限,即最终仲裁者。接收用户的作业提交,并通过NM分配、管理各个机器上的计算资源。
YARN中的从角色,一台机器上一个,负责管理本机器上的计算资源。
根据RM命令,启动Container容器、监视容器的资源使用情况。并且向RM主角色汇报资源使用情况。
Yarn 进行资源分配的单位是容器(Container
),每个容器包含了一定量的内存、CPU 等计算资源,默认配置下,每个容器包含一个 CPU 核心。容器由 NodeManager 进程启动和管理,NodeManger 进程会监控本节点上容器的运行状况并向 ResourceManger 进程汇报。
应用程序管理器负责应用程序的提交、监控应用程序运行状态等。应用程序启动后需要在集群中运行一个 ApplicationMaster
,ApplicationMaster
也需要运行在容器里面。每个应用程序启动后都会先启动自己的 ApplicationMaster
,由 ApplicationMaster
根据应用程序的资源需求进一步向 ResourceManager
进程申请容器资源,得到容器以后就会分发自己的应用程序代码到容器上启动,进而开始分布式计算。
我们以一个 MapReduce 程序为例,来看一下 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
,它是ResourceManager
的核心组件之一。Scheduler
完全专用于调度作业,它无法跟踪应用程序的状态。 Yarn中提供了三种调度器,FIFO Scheduler
(先进先出调度器)、Capacity Scheduler
(容量调度器)、Fair Scheduler
(公平调度器)。Apache版本YARN默认使用Capacity Scheduler
。
FIFO Scheduler
是一个先进先出的思想,即先提交的应用先运行。调度工作不考虑优先级和范围,适用于负载较低的小规模集群。当使用大型共享集群时,它的效率较低且会导致一些问题。
FIFO Scheduler
拥有一个控制全局的队列queue,默认queue名称为default,该调度器会获取当前集群上所有的资源信息作用于这个全局的queue。
优势:
坏处:
Capacity Scheduler
容量调度是Apache Hadoop3.x默认调度策略。该策略允许多个组织共享整个集群资源,每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。
Capacity
可以理解成一个个的资源队列,这个资源队列是用户自己去分配的。队列内部又可以垂直划分,这样一个组织内部的多个成员就可以共享这个队列资源了,在一个队列内部,资源的调度是采用的是先进先出(FIFO)策略。
优势
层次化的管理,可以更容易、更合理分配和限制资源的使用。
每个队列上都可以设置一个资源的占比,保证每个队列都不会占用整个集群的资源。
每个队列有严格的访问控制。用户只能向自己的队列里面提交任务,而且不能修改或者访问其他队列的任务。
空闲的资源可以被分配给任何队列。 当多个队列出现争用的时候,则会按照权重比例进行平衡。
Fair Scheduler叫做公平调度,提供了YARN应用程序公平地共享大型集群中资源的另一种方式。使所有应用在平均情况下随着时间的流逝可以获得相等的资源份额。
Fair Scheduler设计目标是为所有的应用分配公平的资源(对公平的定义通过参数来设置)。
公平调度可以在多个队列间工作,允许资源共享和抢占。
如何理解公平共享?
优势
Yarn作为一个通用的资源管理平台,简单总结有两大块功能,一个是为计算任务分配CPU、内存等计算资源,另外一个是计算任务该什么时候调度运行。但是它的格局更大,只要实现Yarn提供的编程规范,不仅能运行自己Hadoop的MapReduce计算任务,还可以运行其他比如Spark、Flink等其他产品的计算任务。所以这是一个非常优秀的平台,或者说框架。
如果本文对你有帮助的话,请留下一个赞吧
欢迎关注个人公众号——JAVA旭阳
更多学习资料请移步:程序员成神之路