一、YARN概述
思考:
1)如何管理集群资源?
2)如何给任务合理分配资源?
Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序。
二、YARN基础架构
YARN主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成。
![](https://img2020.cnblogs.com/blog/2087967/202109/2087967-20210908111643824-1154361531.png)
三、YARN工作机制
![](https://img2020.cnblogs.com/blog/2087967/202109/2087967-20210908111650241-139958434.png)
#1.MR程序提交到客户端所在的节点。
#2.YarnRunner向ResourceManager申请一个Application。
#3.RM将该应用程序的资源路径返回给YarnRunner。
#4.该程序将运行所需资源提交到HDFS上。
#5.程序资源提交完毕后,申请运行mrAppMaster。
#6.RM将用户的请求初始化成一个Task。
#7.其中一个NodeManager领取到Task任务。
#8.该NodeManager创建容器Container,并产生MRAppmaster。
#9.Container从HDFS上拷贝资源到本地。
#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申请注销自己。
四、作业提交全过程
![](https://img2020.cnblogs.com/blog/2087967/202109/2087967-20210908111847312-438510919.png)
![](https://img2020.cnblogs.com/blog/2087967/202109/2087967-20210908111850975-630454412.png)
![](https://img2020.cnblogs.com/blog/2087967/202109/2087967-20210908111900817-990160959.png)
#作业提交全过程详解:
1)作业提交
第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。
第2步:Client向RM申请一个作业id。
第3步:RM给Client返回该job资源的提交路径和作业id。
第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。
第5步:Client提交完资源后,向RM申请运行MrAppMaster。
2)作业初始化
第6步:当RM收到Client的请求后,将该job添加到容量调度器中。
第7步:某一个空闲的NM领取到该Job。
第8步:该NM创建Container,并产生MRAppmaster。
第9步:下载Client提交的资源到本地。
3)任务分配
第10步:MrAppMaster向RM申请运行多个MapTask任务资源。
第11步:RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。
4)任务运行
第12步:MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask对数据分区排序。
第13步:MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。
第14步:ReduceTask向MapTask获取相应分区的数据。
第15步:程序运行完毕后,MR会向RM申请注销自己。
5)进度和状态更新
YARN中的任务将其进度和状态(包括counter)返回给应用管理器, 客户端每秒(通过mapreduce.client.progressmonitor.pollinterval设置)向应用管理器请求进度更新, 展示给用户。
6)作业完成
除了向应用管理器请求作业进度外, 客户端每5秒都会通过调用waitForCompletion()来检查作业是否完成。时间间隔可以通过mapreduce.client.completion.pollinterval来设置。作业完成之后, 应用管理器和Container会清理工作状态。作业的信息会被作业历史服务器存储以备之后用户核查。
五、YARN调度器和调度算法
目前,Hadoop作业调度器主要有三种:FIFO、容量(Capacity Scheduler)和公平(Fair Scheduler)。Apache Hadoop3.3.1默认的资源调度器是Capacity Scheduler。
CDH框架默认调度器是Fair Scheduler。
具体设置详见:yarn-default.xml文件
<property>
<description>The class to use as the resource scheduler.</description>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
1.先进先出调度器(FIFO)
FIFO调度器(First In First Out):单队列,根据提交作业的先后顺序,先来先服务。
优点:简单易懂;
缺点:不支持多队列,生产环境很少使用;
![](https://img2020.cnblogs.com/blog/2087967/202109/2087967-20210908111729651-987435309.png)
2.容量调度器(Capacity Scheduler)
Capacity Scheduler是Yahoo开发的多用户调度器
![](https://img2020.cnblogs.com/blog/2087967/202109/2087967-20210908111914622-1542671240.png)
#1.容量调度器特点:
1)多队列:每个队列可配置一定的资源量,每个队列采用FIFO调度策略。
2)容量保证:管理员可为每个队列设置资源最低保证和资源使用上限
3)灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列。
4)多租户:
支持多用户共享集群和多应用程序同时运行。
为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。
#2.容量调度器资源分配算法
![](https://img2020.cnblogs.com/blog/2087967/202109/2087967-20210908111923038-1256190351.png)
3.公平调度器(Fair Scheduler)
Fair Schedulere是Facebook开发的多用户调度器。
![](https://img2020.cnblogs.com/blog/2087967/202109/2087967-20210908111929821-70865946.png)
#1.公平调度器特点:
1)与容量调度器相同点
(a)多队列:支持多队列多作业
(b)容量保证:管理员可为每个队列设置资源最低保证和资源使用上线
(c)灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列。
(d) 多租户: 支持多用户共享集群和多 应用程序同时运行;为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。
2)与容量调度器不同点
(1)核心调度策略不同
(2)每个队列可以单独设置资源分配方式
容量调度器:优先选择资源利用率低的队列
容量调度器: FIFO、DRF
公平调度器:优先选择对资源的缺额比例大的
公平调度器: FIFO、FAIR、DRF
#2.公平调度器----缺额
![](https://img2020.cnblogs.com/blog/2087967/202109/2087967-20210908111941621-590077097.png)
#3.公平调度器队列资源分配方式
![](https://img2020.cnblogs.com/blog/2087967/202109/2087967-20210908111948538-1515092371.png)
#4.公平调度器资源分配算法
![](https://img2020.cnblogs.com/blog/2087967/202109/2087967-20210908111954938-2118158522.png)
#5.公平调度器队列资源分配方式
(a)不加权(关注点是Job的个数) :
需求:有一条队列总资源12个,有4个job, 对资源的
需求分别是:
job1->1,job2->2,job3->6, job4->5
第一次算: 12/4=3
job1:分3 -->多2个
job2: 分3 -->多1个
job3:分3 -->差3个
job4:分3 -->差2个
第二次算:3/2=1.5
job1:分1
job2:分2
job3:分3 -->差3个-->分1.5 -->最终: 4.5
job4:分3 -->差2个-->分1.5 -->最终: 4.5
第n次算:一直算到没 有空闲资源
(b)加权(关注点是Job的权重) :
需求:有一条队列总资源16,有4个job
对资源的需求分别是:
job1->4,job2->2 job3->10 job4->4
每个job的权重为:
job1->5 job2->8 job3->1 job4->2
第一次算: 16 / (5+8+1+2) = 1
job1:分5 --> 多1
job2:分8 -->多6
job3:分1 --> 少9
job4:分2 -->少2
第二次算:7 /(1+2) = 7/3
job1:分4
job2:分2
job3:分1 -->分7/3 (2.33) -->少6.67
job4:分2 --> 分14/3(4.66) -->多2. 66
第三次算:2.66/1=2.66
job1:分4
job2:分2
job3:分1 -->分2.66/1 -->分2. 66
job4:分4
第n次算:一直算到没有 空闲资源
(c) DRF策略
DRF (Dominant Resource 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和内存)的一个不同比例的限制。
六、YARN常用命令
Yarn状态的查询,除了可以在hadoop103:8088页面查看外,还可以通过命令操作。常见的命令操作如下所示:
需求:执行WordCount案例,并用Yarn命令查看任务运行情况。
[delopy@hadoop102 ~]$ myhadoop.sh start
[delopy@hadoop102 ~]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount /input /output
1.yarn application查看任务
#1.列出所有Application:
[delopy@hadoop102 ~]$ yarn application -list
2021-09-08 10:00:45,076 INFO client.DefaultNoHARMFailoverProxyProvider: Connecting to ResourceManager at hadoop103/10.0.0.103:8032
Total number of applications (application-types: [], states: [SUBMITTED, ACCEPTED, RUNNING] and tags: []):0
Application-Id Application-Name Application-Type User Queue State Final-State Progress Tracking-URL
#2.根据Application状态过滤:yarn application -list -appStates (所有状态:ALL、NEW、NEW_SAVING、SUBMITTED、ACCEPTED、RUNNING、FINISHED、FAILED、KILLED)
[delopy@hadoop102 ~]$ yarn application -list -appStates FINISHED
2021-09-08 10:01:41,007 INFO client.DefaultNoHARMFailoverProxyProvider: Connecting to ResourceManager at hadoop103/10.0.0.103:8032
Total number of applications (application-types: [], states: [FINISHED] and tags: []):1
Application-Id Application-Name Application-Type User Queue State Final-State Progress Tracking-URL
application_1612577921195_0001 word count MAPREDUCE delopy default FINISHED SUCCEEDED 100% http://hadoop102:19888/jobhistory/job/job_1612577921195_0001
#3.Kill掉Application:
[delopy@hadoop102 ~]$ yarn application -kill application_1612577921195_0001
2021-09-08 10:02:43,007 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.10.103:8032
Application application_1612577921195_0001 has already finished
2.yarn logs查看日志
#1.查询Application日志:yarn logs -applicationId <ApplicationId>
[delopy@hadoop102 ~]$ yarn logs -applicationId application_1612577921195_0001
#2.查询Container日志:yarn logs -applicationId <ApplicationId> -containerId <ContainerId>
[delopy@hadoop102 ~]$ yarn logs -applicationId application_1612577921195_0001 -containerId container_1612577921195_0001_01_000001
3.yarn applicationattempt查看尝试运行的任务
#1.列出所有Application尝试的列表:yarn applicationattempt -list <ApplicationId>
[delopy@hadoop102 ~]$ yarn applicationattempt -list application_1612577921195_0001
2021-09-08 10:05:43,195 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.10.103:8032
Total number of application attempts :1
ApplicationAttempt-Id State AM-Container-Id Tracking-URL
appattempt_1612577921195_0001_000001 FINISHED container_1612577921195_0001_01_000001 http://hadoop103:8088/proxy/application_1612577921195_0001/
#2.打印ApplicationAttemp状态:yarn applicationattempt -status <ApplicationAttemptId>
[delopy@hadoop102 ~]$ yarn applicationattempt -status appattempt_1612577921195_0001_000001
2021-09-08 10:08:43,896 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.10.103:8032
Application Attempt Report :
ApplicationAttempt-Id : appattempt_1612577921195_0001_000001
State : FINISHED
AMContainer : container_1612577921195_0001_01_000001
Tracking-URL : http://hadoop103:8088/proxy/application_1612577921195_0001/
RPC Port : 34756
AM Host : hadoop104
Diagnostics :
4.yarn container查看容器
#1.列出所有Container:yarn container -list <ApplicationAttemptId>
[delopy@hadoop102 ~]$ yarn container -list appattempt_1612577921195_0001_000001
2021-09-08 10:09:43,396 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.10.103:8032
Total number of containers :0
Container-Id Start Time Finish Time State Host Node Http Address
#2.打印Container状态:yarn container -status <ContainerId>
[delopy@hadoop102 ~]$ yarn container -status container_1612577921195_0001_01_000001
2021-09-08 10:10:23,554 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.10.103:8032
Container with id 'container_1612577921195_0001_01_000001' doesn't exist in RM or Timeline Server.
ps:只有在任务跑的途中才能看到container的状态
5.yarn node查看节点状态
#1.列出所有节点:yarn node -list -all
[delopy@hadoop102 ~]$ yarn node -list -all
2021-09-08 10:10:42,306 INFO client.DefaultNoHARMFailoverProxyProvider: Connecting to ResourceManager at hadoop103/10.0.0.103:8032
Total Nodes:3
Node-Id Node-State Node-Http-Address Number-of-Running-Containers
hadoop104:24699 RUNNING hadoop104:8042 0
hadoop103:30917 RUNNING hadoop103:8042 0
hadoop102:15035 RUNNING hadoop102:8042 0
6.yarn rmadmin更新配置
#1.加载队列配置:yarn rmadmin -refreshQueues
[delopy@hadoop102 ~]$ yarn rmadmin -refreshQueues
2021-09-08 10:11:53,530 INFO client.DefaultNoHARMFailoverProxyProvider: Connecting to ResourceManager at hadoop103/10.0.0.103:8033
7.yarn queue查看队列
#1.打印队列信息:yarn queue -status <QueueName>
[delopy@hadoop102 ~]$ yarn queue -status default
2021-09-08 10:21:59,018 INFO client.DefaultNoHARMFailoverProxyProvider: Connecting to ResourceManager at hadoop103/10.0.0.103:8032
Queue Information :
Queue Name : default
State : RUNNING
Capacity : 100.00%
Current Capacity : .00%
Maximum Capacity : 100.00%
Default Node Label expression : <DEFAULT_PARTITION>
Accessible Node Labels : *
Preemption : disabled
Intra-queue Preemption : disabled