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