一、Yarn框架
ResourceManager(rm):处理客户端请求,启动/监控ApplicationMaster,监控NodeManager、资源调度与分配。
NodeManager(nm):单节点上的资源管理,处理来自rm的命令,处理来自am的命令。
ApplicationMaster(am):数据切分、为应用程序申请资源,并分配给内部任务、任务的监控与容错。
Container:对运行环境的抽象,封装了CPU、内存等多维资源以及环境变量、启动命令等任务运行相关的信息。
二、Yarn任务提交(工作机制)
提交作业:
1.Client调用job.waitForCompletion()方法,向整个集群提交MapReduce作业。
2.Client向rm申请一个作业id。
3.rm返回给Client该job资源提交路径和作业id。
4.Client提交jar、切片信息、配置文件到到指定资源提交路径。
5.Client提交完资源后,向rm申请运行mr AppMaster。
作业初始化:
6.当rm收到Client的请求后,将该job添加到容量调度器中。
7.某一个空闲的nm领走该job。
8.该NM创建Container,并产生MR AppMaster。
9.下载Client提交的资源到本地。
任务分配:
10.MRAppMaster向rm申请运行多个maptask任务资源。
11.rm将运行maptask的任务分配给另外两个NodeManager,另外两个NodeManager分别领取任务并创建容器。
任务运行:
12.MR向两个接受任务的NodeManager发送程序启动脚本,将两个NodeManager分别启动maptask,maptask对数据分区排序。
13.MRAppMaster等待所有的maptask运行完毕后,向rm申请容器,运行reducetask。
14.reducetask向maptask获取相应部分数据。
15.程序运行完毕,MR会向rm申请注销自己。
进度和状态更新:
Yarn中的任务将其进度和状态返回给应用管理器,客户端每秒(通过mapreduce.client.progressmonitor.pollinterval设置)向应用管理器请求进度更新,展示给用户。
作业完成:
除了向应用管理器请求作业进度外,客户端每5s都会通过waitForCompletion()来检查作业是否完成。时间间隔可以通过mapreduce.client.completion.pollinterval来设置。作业完成之后,应用管理器和Container都会清理工作状态。作业的信息会被作业历史服务器存储以备之后用户查看。
三、Yarn调度策略
hadoop的作业调度有3中:FIFO、Capacity Schedule、Fair Schedule。
hadoop2.9.2默认调度策略是 Capacity Schedule(yarn-site.xml配置里有)。
3.1 FIFO(先进先出调度器:按照任务到达的时间顺序,先到先服务) 
3.2 Capacity Schedule(容量调度器,Apache Hadoop默认的)
允许多个组织共享整个集群,每个组织可以获取集群一部分计算能力。通过为每个组织分配专门的队列,再为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式为多个组织提供服务了。除此之外,队列内部又可以垂直划分,这样一个组织内部多个成员就可以共享这个队列资源了,在一个队列内部,资源的调度采用的是先进先出(FIFO)策略。
3.3 Fair Schedule(CDH版本Hadoop 默认使用的调度方式)
Fair调度器设计目标是为所有应用分配公平的资源(对公平的定义可以通过参数来设置)。公平调度也可以在多个队列间工作。
举个例子,假设有两个用户A和B,他们分别拥有一个队列。
当A启动一个job而B没有任务时,A会获得全部集群资源;当B启动一个job后,A的job会继续运
行,不过一会儿之后两个任务会各自获得一半的集群资源。如果此时B再启动第二个job并且其它
job还在运行,则它将会和B的第一个job共享B这个队列的资源,也就是B的两个job会用于四分之
一的集群资源,而A的job仍然用于集群一半的资源,结果就是资源最终在两个用户之间平等的共
享。
四、Yarn多租户资源隔离配置
Yarn集群资源设置为A、B两个队列。
A队列设置占用资源70%主要用来运行常规的定时任务,
B队列设置占用资源30%主要运行临时任务,
两个队列间可相互资源共享,假如A队列资源占满,B队列资源比较充裕,A队列可以使用B队列的资源,使总体做到资源利用最大化.
选择使用Fair Scheduler调度策略!!
步骤1:配置yarn-site.xml
<!-- 指定我们的任务调度使用fairScheduler的调度方式 -->
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
<description>In case you do not want to use the defaultscheduler</description>
</property>
步骤2:同步到其它三台机器:rsync-script yarn-site.xml
步骤3:创建fair-scheduler.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<allocations>
<defaultQueueSchedulingPolicy>fair</defaultQueueSchedulingPolicy>
<queue name="root" >
<queue name="default">
<aclAdministerApps>*</aclAdministerApps>
<aclSubmitApps>*</aclSubmitApps>
<maxResources>9216 mb,4 vcores</maxResources>
<maxRunningApps>100</maxRunningApps>
<minResources>1024 mb,1vcores</minResources>
<minSharePreemptionTimeout>1000</minSharePreemptionTimeout>
<schedulingPolicy>fair</schedulingPolicy>
<weight>7</weight>
</queue>
<queue name="queue1">
<aclAdministerApps>*</aclAdministerApps>
<aclSubmitApps>*</aclSubmitApps>
<maxResources>4096 mb,4vcores</maxResources>
<maxRunningApps>5</maxRunningApps>
<minResources>1024 mb, 1vcores</minResources>
<minSharePreemptionTimeout>1000</minSharePreemptionTimeout>
<schedulingPolicy>fair</schedulingPolicy>
<weight>3</weight>
</queue>
</queue>
<queuePlacementPolicy>
<rule create="false" name="specified"/>
<rule create="true" name="default"/>
</queuePlacementPolicy>
</allocations>
步骤4:http://linux123:8088/cluster/scheduler查看资源分配情况。