YARN经过两类长期运行的守护进程提供本身的核心服务:node
YARN有一个灵活的资源请求模型,请求多个容器时,除了能够指定每一个容器须要的计算资源数量(内存和cpu)还能够指定对容器的本地限制要求。
本地化能够确保计算尽量的靠近数据,减小集群带宽资源,本地限制可用于申请位于指定节点或机架或集群中任意位置的容器。
本地限制没法知足时,要么不分配资源,要么选择放松限制。
一般启动一个容器用于处理map任务时,应用首先会向存储该数据块三个复本的节点或者存储这些复本的机架申请一个节点,若是失败,则申请集群中的任意节点。
YARN应用能够在任意时刻提出资源申请,既能够在最开始提出全部的请求,也可没必要一次性申请所有的资源。
Spark就采用了一次性申请的方式,在集群中启动固定数量的执行器。MapReduce采用的动态申请资源的方式,最开始先申请map任务容器,reduce任务容器的启动在map任务完成事后启动。web
用户做业之间的映射关系分类:apache
YARN中有三种调度器可用:缓存
容量调度器容许多个组织共享一个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开启抢占功能。