目录
一、Yarn基础架构
YARN主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成。
1.学习结构
2.调度器
2.1先进先出调度器(FIFO)
FIFO调度器(First In First Out):单队列,根据提交作业的先后顺序,先来先服务。
优点:简单易懂;
缺点:不支持多队列,生产环境很少使用;
2.2容量调度器(Capacity Scheduler)
是一种多用户调度器。
(1)特点
a.多队人列:每个队列可配置一定的资源量,每个队列采用FIFO调度策略。
b.容量保证:管理员可为每个队列设置资源最低保证和资源使用上限。
c.灵活性:如果一个队列中的资源有剩余,可以暂时共亨给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列。
d.多租户:支持多用户共享集群和多应用程序同时运行。
为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。
(2)资源分配算法
a.队列资源分配:从root开始,使用深度优先搜索算法,优先选择资源占用率最低的队列分配资源。
b.作业资源分配:默认按照提交作业的优先级和提交时间顺序分配资源。
c.容器资源分配:按照容器的优先级分配资源;如果优先级相同,按照数据本地性原则:
①任务和数据在同一节点。
②任务和数据在同一机架。
③任务和数据不在同一节点也不在同一机架。
2.3公平调度器(Fair Scheduler)
是一种多用户调度器。
(1)与容量调度器相同点
a.多队列:支持多队列多作业。
b.容量保证:管理员可为每个队列设置资源最低保证和资源使用上限。
c.灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列。
d.多用户:支持多用户共享集群和多应用程序同时运行;为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源进行限定。
(2)与容量调度器不同点
a.核心调度策略不同:容量调度器优先选择资源利用率低的队列;公平调度器优先选择对资源的缺额占比例大的。
b.每个队列可以单独设置资源分配方式:容量调度器是FIFO、DRF;公平调度器是FIFO、FAIR、DRF。
(3)缺额
某一时刻一个作业应获资源和实际获得资源的差距叫做“缺额”。
调度器会优先为缺额大的作业分配资源。
(4)DRF策略
DRF (Dorninant Resorrce Fairness),之前的资源,都是单一标准,例如只考虑内存(也是Yarn默认的情况)。但是很多时候我们资源有很多种,例如内存,CPU,网络带宽等,这样我们很难衡量两个应用应该分配的资源比例。
那么在Yarn中,我们用DRF决定如何调度假设集群一其有100 CPU和10T 内存,而应用A需要(2 CPU,300GB),应用B需要 (6 CPU, 100GB)则两个应用分别需要A(2%CPU,3%内存)和B(6%CPU,1%内存)的资源,这就意味着A是内存主导的,B是CPU主导的,针对这种情况,我们可以选择DRF策略对不同应用进行不同资源(CPU和内存)的一个不同比例的限制。
二、命令行操作
三、相关配置
1.案例1
需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。
需求分析:
1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster
平均每个节点运行10个 / 3台 ≈ 3个任务(4 3 3)
选择调度器,默认容量 |
ResourceManager处理调度器请求的线程数量,默认50;如果提交的任务数大于50,可以增加该值,但是不能超过3台 * 4线程 = 12线程(去除其他应用程序实际不能超过8) |
是否让yarn自动检测硬件进行配置,默认是false,如果该节点有很多其他应用程序,建议手动配置。如果该节点没有其他应用程序,可以采用自动 |
是否将虚拟核数当作CPU核数,默认是false,采用物理CPU核数 |
虚拟核数和物理核数乘数,默认是1.0 | NodeManager使用内存数,默认8G,修改为4G内存 |
nodemanager的CPU核数,不按照硬件环境自动设定时默认是8个,修改为4个 |
容器最小内存,默认1G |
容器最大内存,默认8G,修改为2G |
容器最小CPU核数,默认1个 |
容器最大CPU核数,默认4个,修改为2个 |
虚拟内存检查,默认打开,修改为关闭 |
虚拟内存和物理内存设置比例,默认2.1 |
2.案例2配置队列
需求1:default队列占总内存的40%,最大资源容量占总资源60%,hive队列占总内存的60%,最大资源容量占总资源80%。
需求2:配置队列优先级。
在capacity-scheduler.xml中配置如下:
指定多队列,增加hive队列 |
降低default队列资源额定容量为40%,默认100% |
降低default队列资源最大容量为60%,默认100% |
指定hive队列的资源额定容量 |
用户最多可以使用队列多少资源,1表示 |
指定hive队列的资源最大容量 |
启动hive队列 |
哪些用户有权向队列提交作业 |
哪些用户有权操作队列,管理员权限(查看/杀死) |
哪些用户有权配置提交任务优先级 |
如果application指定了超时时间,则提交到该队列的application能够指定的最大超时时间不能超过该值 |
如果application没指定超时时间,则用default-application-lifetime作为默认值 |
在idea端中的driver添加如下代码可选择队列:
Configuration conf = new Configuration();
conf.set("mapreduce.job.queuename","队列名称");
//1. 获取一个Job实例
Job job = Job.getInstance(conf);
3.案列3任务优先级
容量调度器,支持任务优先级的配置,在资源紧张时,优先级高的任务将优先获取资源。默认情况,Yarn将所有任务的优先级限制为0,若想使用任务的优先级功能,须开放该限制。
修改yarn-site.xml文件,增加以下参数:
<property>
<name>yarn.cluster.max-application-priority</name>
<value>5</value>
</property>
4.案例4公平调度器
创建两个队列,分别是test和atguigu(以用户所属组命名)。期望实现以下效果:若用户提交任务时指定队列,则任务提交到指定队列运行;若未指定队列,test用户提交的任务到root.group.test队列运行,atguigu提交的任务到root.group.atguigu队列运行(注:group为用户所属组)。
公平调度器的配置涉及到两个文件,一个是yarn-site.xml,另一个是公平调度器队列分配文件fair-scheduler.xml(文件名可自定义)。
4.1添加内容向yarn-site.xml文件
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
<description>配置使用公平调度器</description>
</property>
<property>
<name>yarn.scheduler.fair.allocation.file</name>
<value>/opt/module/hadoop-3.1.3/etc/hadoop/fair-scheduler.xml</value>
<description>指明公平调度器队列分配配置文件</description>
</property>
<property>
<name>yarn.scheduler.fair.preemption</name>
<value>false</value>
<description>禁止队列间资源抢占</description>
</property>
4.2配置fair-scheduler.xml
<?xml version="1.0"?>
<allocations>
<!-- 单个队列中Application Master占用资源的最大比例,取值0-1 ,企业一般配置0.1 -->
<queueMaxAMShareDefault>0.5</queueMaxAMShareDefault>
<!-- 单个队列最大资源的默认值 test atguigu default -->
<queueMaxResourcesDefault>4096mb,4vcores</queueMaxResourcesDefault>
<!-- 增加一个队列test -->
<queue name="test">
<!-- 队列最小资源 -->
<minResources>2048mb,2vcores</minResources>
<!-- 队列最大资源 -->
<maxResources>4096mb,4vcores</maxResources>
<!-- 队列中最多同时运行的应用数,默认50,根据线程数配置 -->
<maxRunningApps>4</maxRunningApps>
<!-- 队列中Application Master占用资源的最大比例 -->
<maxAMShare>0.5</maxAMShare>
<!-- 该队列资源权重,默认值为1.0 -->
<weight>1.0</weight>
<!-- 队列内部的资源分配策略 -->
<schedulingPolicy>fair</schedulingPolicy>
</queue>
<!-- 增加一个队列atguigu -->
<queue name="atguigu" type="parent">
<!-- 队列最小资源 -->
<minResources>2048mb,2vcores</minResources>
<!-- 队列最大资源 -->
<maxResources>4096mb,4vcores</maxResources>
<!-- 队列中最多同时运行的应用数,默认50,根据线程数配置 -->
<maxRunningApps>4</maxRunningApps>
<!-- 队列中Application Master占用资源的最大比例 -->
<maxAMShare>0.5</maxAMShare>
<!-- 该队列资源权重,默认值为1.0 -->
<weight>1.0</weight>
<!-- 队列内部的资源分配策略 -->
<schedulingPolicy>fair</schedulingPolicy>
</queue>
<!-- 任务队列分配策略,可配置多层规则,从第一个规则开始匹配,直到匹配成功 -->
<queuePlacementPolicy>
<!-- 提交任务时指定队列,如未指定提交队列,则继续匹配下一个规则; false表示:如果指定队列不存在,不允许自动创建-->
<rule name="specified" create="false"/>
<!-- 提交到root.group.username队列,若root.group不存在,不允许自动创建;若root.group.user不存在,允许自动创建 -->
<rule name="nestedUserQueue" create="true">
<rule name="primaryGroup" create="false"/>
</rule>
<!-- 最后一个规则必须为reject或者default。Reject表示拒绝创建提交失败,default表示把任务提交到default队列 -->
<rule name="reject" />
</queuePlacementPolicy>
</allocations>
四、Tool接口实现
简单,不做解释。
五、重点总结
1.Yarn的工作机制
(1)向ResourceManager申请一个Application。
(2)ResourceManager回应请求并返回Application资源提交路径以及application_id。
(3)提交job运行所需资源,包括Job.xml(配置信息)、Job.split(控制开启多少个Map Task)、wc.jar(程序源码)。
(4)资源提交完毕,申请运行mrAppMaster。
(5)ResourceManager将用户的请求初始化成一个Task。
(6)NodeManager从FIFO调度队列领取到Task任务。
(7)NodeManager创建Container容器。
(8)NodeManager下载job资源到本地。
(9)MRAppmaster申请运行MapTask容器。
(10)NodeManager从调度队列领取到任务,创建容器。
(11)MRAppmaster发送程序启动脚本到MapTask。
(12)MRAppmaster向ResourceManager申请2个容器,运行ReduceTask。
(13)Reduce向Map获取相应分区的数据。
(14)程序运行完后,MR会向ResourceManager注销自己。
2.Yarn的调度器
(1)FIFO/容量调度器/公平调度器
(2)apache默认容量调度器为容量;CDH默认调度器为公平调度器;
(3)公平/容量默认一个default,需要创建多队列;
(4)中小企业:hive、spark、flink、mr。大企业:业务模块:登陆、注册、购物车、营销,好处:解耦、降低风险;
(5)调度器特点:
相同点:支持多队列、可以借资源、支持多用户;
不同点:容量调度器:优先满足先来的任务执行;
公平调度器:在队列里面的任务公平享有队列资源;
(6)生产环境怎么选:
中小企业:对并发度要求不高,选择容量;
中大企业:对并发度要求较高,选择公平;
3.开发需要重点掌握内容
(1)队列运行原理;
(2)Yarn常用命令;
(3)核心参数配置;
(4)配置容量调度器和公平调度器;
(5)Tool接口使用;