Apache Yarn全称是:Yet Another Resource Negotiator,是Hadoop的集群资源管理系统。
Yarn提供请求和使用集群资源的API,却很少直接用于用户代码。对用户隐藏了资源管理的细节。
Yarn通过两类长期运行的守护进程提供自己的核心服务:
Yarn有一个灵活的资源请求模型。但请求多个容器时,可以指定每个容器需要的计算机资源数量(内存和CPU),还可以指定对容器的本地限制要求。
Yarn应用可以在运行中的任意时刻提出资源申请
Yarn应用生命期差异性很大:有几秒钟的短期应用,也有连续几天甚至几个月的长期应用。
可以按照:应用到用户运行的作业之间的映射关系,对应用进行分类:
MapReduce1中,有两类守护进程控制着作业执行过程:
MapReduce1中,jobtracker同时负责作业调度和认为进度监控。在Yarn中,这些职责由不同的实体负责:Resource Manager和Application Master。
Yarn有三种调度器可用:
优点:简单易懂,不需要任何配置
缺点:不适合共享集群。大的应用会占用集群中的所有资源,所以每个应用必须等待直到轮到自己运行。
在一个共享集群中,更适合使用容量调度器或公平调度器。
这两种调度器都允许长时间运行的作业能及时完成,同时也允许正在进行较小临时查询的用户能够在合理时间内得到返回结果
容量调度器允许多个组织共享一个Hadoop集群,每个组织可以分配到全部集群资源的一部分。
每个组织被配置为一个专门的队列,可以使用一定的集群资源。
每个队列内,使用FIFO调度策略对应用进行调度。
单个队列使用的资源不会超过其队列的容量。如果队列中有多个作业,并且队列资源不够用时,如果仍有空闲的资源,那么容量调度器可能会将空余的资源分配给队列中的作业。
为队列设置一个最大容量限制,这样队列就不会过多地侵占其他队列的容量了。
公平调度器旨在为所有运行的应用公平分配资源。
启用公平调度器,由yarn.resourcemanager.scheduler.class的设置所决定的。默认使用容量调度器(CDH中默认使用公平调度器)。
每个队列可以有不同的调度策略。队列的默认调度策略可以通过顶层元素defaultQueueSchedulingPolicy进行设置,如果省略,默认使用公平调度。
每个队可以配置最大和最小资源数量,及最大可运行的应用的数量。
公平调度器使用一个基于规则的系统来确定应用应该放到哪个队列。queuePlacementPlolicy元素包含了一个规则列表,每条规则会被依次尝试直到匹配成功。
<queuePlacementPlolicy>
<rule name="specified"/>
<rule name="user"/>
queuePlacementPolicy>
抢占
在一个繁忙的集群中,当作业被提交给一个空队列时,作业不会立即启动,直到集群上已经运行的作业释放了资源。为了使作业从提交到执行所需的时间可预测,公平调度器支持“抢占”功能。
所谓抢占,就是允许调度器终止那些占用资源超过其公平共享份额的队列的容器,这些容器资源释放后可以分配给资源数量低于应得份额的队列的容器。
抢占资源会降低整个集群的效率,因为被终止的containers需要重新执行。
在一个繁忙的集群上,如果一个应用请求某个节点,那么极有可能此时有其他容器在该节点上允许。显而易见的处理,立刻放宽本地性需求,在同一机架上分配一个容器。实践证明,此时,如果多等待一小段时间,能增加在所请求的节点上分配到一个容器的机会,从而可以提高集群的效率。这个特性称之为延迟调度。
容量调度器和公平调度器都支持延迟调度。
Dominant Resource Fairness,DRF
对于单一类型的资源,容量或公平性的概念很容易确定。当有多种资源类型进行调度时,观察每个用户的主导资源,并将其作为对集群资源使用的一个度量。