# YARN

YARN是一种集群管理技术,全称是Yet Another Resource Negotiator。

# YARN架构

YARN的基本思想是将资源管理和调度及监控功能从MapReduce分离出来,用独立的后台进程实现。这个想法需要有一个全局的资源管理器(ResourceManager),每个应用还要有一个应用主管(ApplicationMaster)。应用可以是一个单独MapReduce作业,或者是一个作业的有向无环图(DAG)。

资源管理器和节点管理器(NodeManager)构成了分布式数据计算框架。资源管理器是系统中所有应用资源分配的最终仲裁者。节点管理器是框架中每个工作节点的代理,监控节点CPU、内存、磁盘、网络等资源的使用,并且报告给资源管理器。

每个应用对应的ApplicationMaster实际上是框架中一组特定的库,负责从资源管理器协调资源,并和节点管理器一起工作,共同执行和监控任务。

资源管理器有两个主要组件:调度器和应用管理器。调度器负责给多个正在运行的应用分配资源,比如对每个应用所能使用的资源做限 限制,按一定规则排队等。调度器只负责资源分配,它不监控或跟踪应用的状态。而且,当任务因为应用的错误或硬件问题而失败后,调度器不保证能重启它们。调度器根据应用对资源的需求执行其调度功能,这基于一个叫做资源容器的抽象概念。资源容器由内存、CPU、磁盘、网络等元素构成。调度器使用一个可插拔的调度策略,将集群资源分配给多个应用。当前支持的调度器如CapacityScheduler和FairScheduler就是可插拔调度器的例子。

应用管理器负责接收应用提交的作业,协调执行特定应用所需的资源容器,并在ApplicationMaster容器失败时提供重启服务。每个应用对应一个ApplicationMaster,它向调度器请求适当的资源容器,并跟踪应用的状态和资源使用情况。

Hadoop-2.x的MapReduce API保持与之前的稳定版本(Hadoop-1.x)兼容。这意味着老的MapReduce作业不需要做任何修改,只需要重新编译就可以在YARN上执行。

# Capacity调度器

Capacity调度器以一种操作友好的方式,把Hadoop应用作为一个共享的、多租户集群来运行,并把集群利用率和吞吐量最大化。Capacity调度器允许多用户安全地共享一个大规模Hadoop集群,并保证它们的性能。其核心思想是,Hadoop集群中的可用资源为多个用户所共享,资源的多少是由他们的计算需求决定的。基于这种思想带来的一个好处是,只要资源没有被其他用户使用,一个用户就可以使用它,从而以一种具有成本效益的方式提供资源的弹性使用。

多个用户共享集群,必须要实现所谓的多租户(multi-tenancy)技术,这是因为集群中的每个用户任务都必须保证高性能和安全性。特别是集群中出现了某个用户或应用试图占用大量资源时,共享的集群必须做到不影响其他用户的使用。Capacity调度器提供了一套严格的限制机制,确保单一应用或用户不能消耗集群中不成比例的资源数量。并且,Capacity调度器可能限制或挂起一个异常应用,以保证整个集群的稳定。

Capacity调度器一个主要的抽象概念是队列(queues)。队列是Capacity的基础调度单元,管理员可以通过配置队列来影响共享集群的使用。为了提供更多的控制和可预测性,Capacity调度器支持层次队列,保证资源在允许其他队列使用之前,被一个用户的子队列优先共享,以此为特定应用提供资源亲和性。

# Fair调度器

Fair调度是将资源公平分配给应用的方法,使得所有应用在平均情况下随着时间得到相等的份额。新一代Hadoop有能力调度多种资源类型。默认时Fair调度器只在内存上采用公平调度。

在Fair调度模型中,每个应用都属于某一个队列。YARN Container的分配是选择使用了最少资源的队列,在这个队列中,再选择使用了最少资源的应用程序。默认情况下,所有的用户共享一个称为“default”的队列。如果一个应用程序在Container资源请求中指定了队列,则将请求提交到该队列中。另外,还可以将Fair调度器配置成根据请求中包含的用户名来分配队列。Fair调度器还支持许多功能,如队列的权重(权重大的队列获得更多的Container),最小份额,最大份额,以及队列内的FIFO策略,但基本思想是尽可能平均地共享资源。

在Fair调度器下,如果单个应用程序正在运行,该应用程序可以请求整个集群资源。若有其他程序提交,空闲的资源可以被公平地分配给新的应用程序,使每个应用程序最终可以获得大致相当的资源。Fair调度器也支持抢占的概念,从而可以从ApplicationMaster要回Container。根据配置和应用程序的设计,抢占和随后的资源分配可以是友好的或者强制的。

除了提供公平共享,Fair调度器还允许保证队列的最小份额,这是确保某些用户、组,或者应用程序总能得到的资源。当队列中有等待的应用程序,它至少可以获取其最小份额的资源。与此相反,当队列并不需要所有的保证份额,超出的部分可以分配给其他运行的应用程序。为了避免拥有数百个作业的单个用户充斥整个集群,Fair调度器可以通过配置文件限制用户和每个队列中运行应用程序的数量。若达到了该限制,用户应用程序将在队列中等待,直到前面提交的作业完成。

# Container

在最基本的层面,Container是单个节点上内存、CPU核和磁盘等物理资源的集合。单个节点上可以有多个Container。系统中的每个节点可以认为是由内存和CPU最小容量的多个Container组成。ApplicationMaster可以请求任何Container来占据最小容量的整数倍的资源。因此Container代表了集群中单个节点上的一组资源(内存、CPU等),由节点管理器监控,由资源管理器调度。

每个应用程序从ApplicationMaster开始,它本身就是一个Container。一旦启动,ApplicationMaster就与资源管理器协商更多的Container。在运行过程中,可以动态地请求或者释放Container。例如,一个MapReduce作业可以请求一定数量的Map Container,当Map任务结束时,它可以释放这些Map Container,并请求更多的Reduce Container。

# NodeManager

NodeManager是DataNode节点上的“工作进程”代理,管理Hadoop集群中独立的计算节点。其职责包括与ResourceManager保持通信、管理Container的生命周期、监控每个Container的资源使用情况、跟踪节点健康状况、管理日志和不同应用程序的附属服务服务(auxiliary services)等。

在启动时,NodeManager向ResourceManager注册,然后发送包含了自身状态的心跳,并等待来自ResourceManager的指令。它的主要目的是管理ResourceManager分配给它的应用程序Container。

# ApplicationMaster

不同于YARN的其他组件,Hadoop 1.x中没有组件和ApplicationMaster相对应。本质上讲,ApplicationMaster所做的工作,就是原来JobTracker为每个应用所做的,但实现却是完全不同的。

运行在Hadoop集群上的每个应用程序,都有自己专用的Application Master实例,它实际上运行在每个从节点的一个Container进程中。而JobTracker是运行在主节点上的单个后台进程,跟踪所有应用的进行情况。 ApplicationMaster会周期性地向ResourceManager发送心跳消息,报告自身的状态和应用的资源使用情况。ResourceManager根据调度的结果,给特定从节点上的ApplicationMaster分配一个预留的Container的资源租约。

ApplicationMaster监控一个应用的整个生命周期,从Container请求所需的资源开始,到ResourceManager将租约请求分配给NodeManager。

为Hadoop编写的每个应用框架都有自己的ApplicationMaster实现。在YARN的设计中,MapReduce只是一种应用程序框架,这种设计允许使用其他框架建立和部署分布式应用程序。例如,YARN附带了一个Distributed-Shell应用程序,它允许在YARN集群中的多个节点运行一个shell脚本。

更新时间: 3/21/2020, 3:57:55 PM