Hadoop权威指南 第4章 关于YARN


YARN(Yet Another Resource Negotiator)是hadoop的集群资源管理系统。YARN被引入Hadoop2,最初是为了改善MapReduce的实现,但它具备足够的额通用性,一样能够支持其余的分布式计算模式。
在这里插入图片描述

图:YARN应用
YARN提供请求和使用集群资源的API,但这些API不多直接用于用户代码。用户代码中用的是分布式计算框架提供的更高层API,这些API简历在YARN之上且向用户隐藏了资源管理细节。 还有一些应用时间里在上图所示框架之上,如Pig、Hive、Crunch都是运行在MapReduce、Spark、Tez之上的处理框架。

YARN运行机制

YARN经过两类长期运行的守护进程提供本身的核心服务:node

  1. 资源管理器:resource manager,管理集群上资源的使用
  2. 节点管理器:node manager,运行在集群全部节点上,可以启动和监控容器container

在这里插入图片描述

图:YARN应用的运行机制
  1. 为了在YARN上运行一个应用,客户端联系资源管理器,要求它运行一个application master进程。
  2. 资源管理器找到一个可以在容器中启动application master的节点管理器。
  3. application master一旦运行起来后可以作些什么依赖应用自己,多是简单的运行一个计算并返回结果,也可能如图所示,项资源管理器请求更太多的容器。
  4. 请求新的容器后,就可以运行一个分布式计算
    YARN不会为应用的各部分彼此通讯提供任何手段。

资源请求

YARN有一个灵活的资源请求模型,请求多个容器时,除了能够指定每一个容器须要的计算资源数量(内存和cpu)还能够指定对容器的本地限制要求。
本地化能够确保计算尽量的靠近数据,减小集群带宽资源,本地限制可用于申请位于指定节点或机架或集群中任意位置的容器。
本地限制没法知足时,要么不分配资源,要么选择放松限制。
一般启动一个容器用于处理map任务时,应用首先会向存储该数据块三个复本的节点或者存储这些复本的机架申请一个节点,若是失败,则申请集群中的任意节点。
YARN应用能够在任意时刻提出资源申请,既能够在最开始提出全部的请求,也可没必要一次性申请所有的资源。
Spark就采用了一次性申请的方式,在集群中启动固定数量的执行器。MapReduce采用的动态申请资源的方式,最开始先申请map任务容器,reduce任务容器的启动在map任务完成事后启动。web

用户做业之间的映射关系分类:apache

  1. 一个用户做业对应一个应用,MapReduce采用的方式
  2. 做业的每一个工做流或每一个用户会哈对应一个应用,容器能够在做业之间重用,而且有可能缓存做业之间的中间数据。Spark采用的这种模式
  3. 多个用户共享一个长期运行的应用。

YARN中的调度

调度选项

YARN中有三种调度器可用:缓存

  1. FIFO调度器,将应用放置在一个队列中,而后按照提交的顺序运行应用,优势是简单易懂,不须要额外配置,可是不适合共享集群,大的应用会占用集群中全部资源,每一个应用必须等待直到轮到本身运行在这里插入图片描述
    如图所示,大的应用job1会占用集群中全部资源,job2必须等待直到轮到本身运行
  2. 容量调度器,有一个独立的专门的任务队列保证小做业已提交就可以启动在这里插入图片描述
    因为队列容量是为小做业单独保留,因此这种策略是以整个集群利用率为代价的
  3. 公平调度器,不须要预留必定量的资源,由于调度器会在全部运行的做业之间动态平衡资源在这里插入图片描述
    当一个做业启动时,它是惟一一个做业,而获取集群中的全部资源。当第二个做业启动时,他被分配到集群中一半的资源

容量调度器配置

容量调度器容许多个组织共享一个Hadoop集群,每一个组织分配到所有集群资源的一部分,每一个组织被配置一个专门的队列,每一个队列被配置为可使用必定的集群资源。在一个队列内部,使用FIFO调度策略对应用进行调度。当一个队列中有多个做业,且资源不够用时,有可能使用其余队列的空闲资源。容器调度器不会经过强制停止进行抢占容器。在这里插入图片描述app

图:队列的层次结构

root下有两个队列prod和dev,分别占40%和60%的容量,dev队列进一步分红eng和science两个容量相等的队列
capacity-scheduler.xml框架

<?xml version="1.0"?>
<configuration>
    <property>
        <name>yarn.scheduler.capacity.root.queues</name>
        <value>prod,dev</value>
    </property>
    <property>
        <name>yarn.scheduler.capacity.root.dev.queues</name>
        <value>eng,science</value>
    </property>
    <property>
        <name>yarn.scheduler.capacity.root.prod.capacity</name>
        <value>40</value>
    </property>
    <property>
        <name>yarn.scheduler.capacity.root.dev.capacity</name>
        <value>60</value>
    </property>
    <property>
        <name>yarn.scheduler.capacity.root.dev.maxinum-capacity</name>
        <value>75</value>
    </property>
    <property>
        <name>yarn.scheduler.capacity.root.dev.eng.capacity</name>
        <value>50</value>
    </property>
    <property>
        <name>yarn.scheduler.capacity.root.dev.science.capacity</name>
        <value>50</value>
    </property>
</configuration>

其中dev最大容器设置为75%,所以即便prod队列空闲,dev队列也不会占用所有的集群资源。prod队列即刻可以使用的可用资源比例老是可以达到25%。prod队列可能会占用所有的集群资源。
将应用放到哪一个队列取决于应用自己。在MapReduce中,能够经过设置属性mapreduce.job.queuename来指定要用到的队列。分布式

公平调度器配置

公平调度器旨在为全部运行的应用公平的分配资源。在这里插入图片描述svg

图:用户队列间的公平共享

两个用户A和B,分别拥有本身的队列。A启动一个做业1,在B没有需求时A会分配到所有的可用资源;看成业1在运行中时,B提交做业2,一段时间后,每一个做业占用一半的集群资源。这是若是B提交做业3,那么做业3和做业2共享资源,所以做业2和做业3个占用四分之一的集群资源,最终就是资源在用户之间实现公平共享。oop

默认是使用容量调度器,若是使用公平调度器,须要将yarn-site.xml文件中的yarn.resourcemanager.scheduler.class设置为公平调度器的彻底限定名:org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairSchdduler。spa

经过fair-scheduler.xml对公平调度器进行配置

<?xml version="1.0"?>
<allocations>
    <defaultQueueSchedulingPolicy>fair</defaultQueueSchedulingPolicy>
    
    <queue name="prod">
        <weight>40</weight>
        <schedulingPolicy>fifo</schedulingPolicy>
    </queue>
    
    <queue name="dev">
        <weight>60</weight>
        <queue name="eng" />
        <queue name="science" />
    </queue>
    
    <queuePlacementPllicy>
        <rule name="specified" create="false" />
        <rule name="primaryGroup" create="false" />
        <rule name="default" create="dev.eng" />
    </queuePlacementPllicy>
</allocations>

每一个队列能够有不一样的调度策略。队列的默认调度策略能够经过顶层元素defaultQueueSchedulingPolicy进行设置,默认使用公平调度。 公平调度器也支持队列级别的FIFO策略,以及Dominant Resource Fairness策略。prod队列使用了FIFO调度策略。 queuePlacementPllicy指定了一个应用应该放在哪一个队列中,会从第一条规则开始匹配,直到匹配成功。 公平调度器支持资源抢占,容许调度器种植哪些占用资源超过了其公平共享份额的队列的容器。经过yarn.scheduler.fair.preemption设置为true开启抢占功能。