目录
- 写在前面
- 一、yarn资源调度器
- 1.1 Yarn基础架构
- 1.2 Yarn工作机制
- 1.3 作业提交全过程
- 1.3.1 作业提交
- 1.3.2 作业初始化
- 1.3.3 任务分配
- 1.3.4 任务运行
- 1.3.5 进度和状态更新
- 1.3.6 作业完成
- 1.4 Yarn调度器和调度算法
- 1.4.1 先进先出调度器(FIFO)
- 1.4.2 容量调度器(Capacity Scheduler)
- 1.4.3 公平调度器(Fair Scheduler)
- 1.5 Yarn常用命令
- 1.5.1 yarn application查看任务
- 1.5.2 yarn logs查看日志
- 1.5.3 yarn applicationattempt查看尝试运行的任务
- 1.5.4 yarn container查看容器
- 1.5.5 yarn node查看节点状态
- 1.5.6 yarn rmadmin更新配置
- 1.5.7 yarn queue查看队列
- 写在最后
写在前面
在大数据时代,Hadoop已经成为处理海量数据的首选平台。而Hadoop YARN(Yet Another Resource Negotiator)作为Hadoop生态系统中的核心组件,更是为大数据处理提供了强大的资源管理和调度能力。本文将深入探讨YARN的工作原理、核心组件及其在大数据处理中的重要作用。
一、yarn资源调度器
YARN(Yet Another Resource Negotiator)是Hadoop生态系统中的一个关键组件,它是Hadoop的集群资源管理器和作业调度器。YARN的设计目的是使Hadoop集群能够更高效地处理大规模数据处理任务。
1.1 Yarn基础架构
YARN主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成。各个组件的作用如下:
- ResourceManager(RM):
- 处理客户端请求
- 监控NodeManager
- 启动或监控ApplicationMaster
- 资源的分配与调度
- NodeManager(NM):
- 管理单个节点上的资源
- 处理来自ResourceManager的命令
- 处理来自ApplicationMaster的命令
- ApplicationMaster(AM):
- 为应用程序申请资源并分配给内部的任务
- 任务的监控与容错
- Container
- Container是yarn中的资源抽象,它封装了某个节点上的多维度资源,如内存、cpu、磁盘、网络等
1.2 Yarn工作机制
(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申请注销自己。
1.3 作业提交全过程
作业提交全过程详解
1.3.1 作业提交
第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。
第2步:Client向RM申请一个作业id。
第3步:RM给Client返回该job资源的提交路径和作业id。
第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。
第5步:Client提交完资源后,向RM申请运行MrAppMaster。
1.3.2 作业初始化
第6步:当RM收到Client的请求后,将该job添加到容量调度器中。
第7步:某一个空闲的NM领取到该Job。
第8步:该NM创建Container,并产生MRAppmaster。
第9步:下载Client提交的资源到本地。
1.3.3 任务分配
第10步:MrAppMaster向RM申请运行多个MapTask任务资源。
第11步:RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创建容器。
1.3.4 任务运行
第12步:MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动MapTask,MapTask对数据分区排序。
第13步:MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。
第14步:ReduceTask向MapTask获取相应分区的数据。
第15步:程序运行完毕后,MR会向RM申请注销自己。
1.3.5 进度和状态更新
YARN中的任务将其进度和状态(包括counter)返回给应用管理器, 客户端每秒(通过mapreduce.client.progressmonitor.pollinterval设置)向应用管理器请求进度更新, 展示给用户。
1.3.6 作业完成
除了向应用管理器请求作业进度外, 客户端每5秒都会通过调用waitForCompletion()来检查作业是否完成。时间间隔可以通过mapreduce.client.completion.pollinterval来设置。作业完成之后, 应用管理器和Container会清理工作状态。作业的信息会被作业历史服务器存储以备之后用户核查。
1.4 Yarn调度器和调度算法
YARN的调度器负责将可用的集群资源分配给各个应用程序,Hadoop作业调度器主要有三种:FIFO、容量(Capacity Scheduler)和公平(Fair Scheduler)。Apache Hadoop3.2.4默认的资源调度器是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.4.1 先进先出调度器(FIFO)
FIFO调度器(First In First Out):是一种简单的调度算法,它按照任务提交的顺序进行调度。在先进先出调度器中,没有考虑任务的优先级、资源需求和执行时间等因素。
当有多个任务提交到先进先出调度器时,调度器会按照任务递交的顺序,一个接一个地将资源分配给它们。当一个任务完成或者释放了它所占用的资源后,下一个等待中的任务才能开始执行。
优点:简单而且公平
缺点:不支持多队列,生产环境很少使用;
1.4.2 容量调度器(Capacity Scheduler)
Capacity Scheduler是Yahoo开发的多用户调度器。根据集群资源的划分和配置,将资源分配给不同的队列。每个队列都有一个最大可用资源容量限制,并且可以设置队列之间的优先级。
在Capacity调度器中,管理员可以将集群资源划分为多个队列,每个队列都有自己的最大可用资源容量限制。这些队列可以按照应用程序、部门、用户等多种方式进行划分。管理员还可以为每个队列设置相应的优先级,以确保重要任务或高优先级任务能够获得更多的资源。
Capacity调度器的工作流程如下:
- 资源分配:当一个应用程序提交到集群时,调度器根据应用程序所需的资源量和队列的最大可用资源容量,决定要分配给该应用程序的资源。
- 资源预留:一旦资源分配完成,调度器为应用程序保留分配给它的资源。这意味着其他的应用程序不能使用这些资源,直到分配给该应用程序的任务完成或者释放了资源。
- 队列优先级:在有多个队列的情况下,调度器会根据队列之间的优先级,决定分配资源的顺序。高优先级队列的应用程序将获得更多的资源。
- 资源回收:当一个应用程序的任务完成或者释放了资源,调度器将重新分配这些资源给其他的等待中的应用程序。
1.4.3 公平调度器(Fair Scheduler)
Fair调度器是YARN中常用的一种调度器,它旨在公平地共享集群资源,避免其中一个应用程序垄断资源。
Fair调度器基于公平共享的原则,根据各个应用程序的需求和优先级,动态地分配集群资源。在Fair调度器中,所有的应用程序被视为同等重要,每个应用程序都有一定的权重。调度器会根据应用程序的权重和资源需求来分配资源,以达到公平和均衡的资源分配。
Fair调度器的工作流程如下:
- 资源分配:当一个应用程序提交到集群时,调度器根据应用程序的权重和资源需求,动态地计算出所分配的资源数量。
- 资源预留:资源分配完成后,调度器为应用程序保留分配给它的资源。这意味着其他的应用程序不能使用这些资源,直到分配给该应用程序的任务完成或者释放了资源。
- 队列公平性:在有多个应用程序等待资源的情况下,调度器会根据各个应用程序的权重和公平共享的原则,确定资源分配的顺序。权重较高的应用程序将获得更多的资源。
- 动态调整:随着时间的推移和各个应用程序的资源需求变化,Fair调度器会动态地重新计算每个应用程序的权重和资源分配,保持公平和均衡的资源调度。
1.5 Yarn常用命令
Yarn状态的查询,除了可以在hadoop103:8088页面查看外,还可以通过命令操作。常见的命令操作如下所示:
需求:执行WordCount案例,并用Yarn命令查看任务运行情况。
[amo@hadoop102 hadoop-3.2.4]$ myhadoop.sh start
[amo@hadoop102 hadoop-3.2.4]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input /output
1.5.1 yarn application查看任务
(1)列出所有Application:
[amo@hadoop102 hadoop-3.2.4]$ yarn application -list
2024-03-27 23:17:46,842 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.1.5: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)
[amo@hadoop102 hadoop-3.2.4]$ yarn application -list -appStates FINISHED
2024-03-27 23:19:01,504 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.1.5:8032
Total number of applications (application-types: [], states: [FINISHED] and tags: []):0
Application-Id Application-Name Application-Type User Queue State Final-State Progress Tracking-URL
(3)Kill掉Application:
[amo@hadoop102 hadoop-3.2.4]$ yarn application -kill application_1612577921195_0001
2024-03-27 23:19:01,504 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.10.103:8032
Application application_1612534544195_0001 has already finished
1.5.2 yarn logs查看日志
(1)查询Application日志:yarn logs -applicationId <ApplicationId>
[amo@hadoop102 hadoop-3.2.4]$ yarn logs -applicationId application_1612534544195_0001
(2)查询Container日志:yarn logs -applicationId <ApplicationId> -containerId <ContainerId>
[amo@hadoop102 hadoop-3.2.4]$ yarn logs -applicationId application_1612534544195_0001 -containerId container_1612577921195_0001_01_000001
1.5.3 yarn applicationattempt查看尝试运行的任务
(1)列出所有Application尝试的列表:yarn applicationattempt -list <ApplicationId>
[amo@hadoop102 hadoop-3.2.4]$ yarn applicationattempt -list application_1612577921195_0001
2024-03-27 23:19:11,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>
[amo@hadoop102 hadoop-3.2.4]$ yarn applicationattempt -status appattempt_1612577921195_0001_000001
2024-03-27 23:19:25,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 :
1.5.4 yarn container查看容器
(1)列出所有Container:yarn container -list <ApplicationAttemptId>
[amo@hadoop102 hadoop-3.2.4]$ yarn container -list appattempt_1612577921195_0001_000001
2024-03-27 23:30:11,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>
[amo@hadoop102 hadoop-3.2.4]$ yarn container -status container_1612577921195_0001_01_000001
2024-03-27 23:25:39,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.
注:只有在任务跑的途中才能看到container的状态
1.5.5 yarn node查看节点状态
列出所有节点:yarn node -list -all
[amo@hadoop102 hadoop-3.2.4]$ yarn node -list -all
2024-03-27 23:31:36,962 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.10.103:8032
Total Nodes:3
Node-Id Node-State Node-Http-Address Number-of-Running-Containers
hadoop103:38168 RUNNING hadoop103:8042 0
hadoop102:42012 RUNNING hadoop102:8042 0
hadoop104:39702 RUNNING hadoop104:8042 0
1.5.6 yarn rmadmin更新配置
加载队列配置:yarn rmadmin -refreshQueues
[amo@hadoop102 hadoop-3.2.4]$ yarn rmadmin -refreshQueues
2024-03-27 23:22:11,331 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.10.103:8033
1.5.7 yarn queue查看队列
打印队列信息:yarn queue -status <QueueName>
[amo@hadoop102 hadoop-3.2.4]$ yarn queue -status default
2024-03-27 23:27:51,403 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.10.103:8032
Queue Information :
Queue Name : default
State : RUNNING
Capacity : 100.0%
Current Capacity : .0%
Maximum Capacity : 100.0%
Default Node Label expression : <DEFAULT_PARTITION>
Accessible Node Labels : *
Preemption : disabled
Intra-queue Preemption : disabled
写在最后
YARN的出现极大地提高了Hadoop集群的资源利用率和任务调度效率。通过统一的资源管理和调度,YARN能够实现多个应用程序在同一个集群上的并行运行,避免了资源浪费和竞争。同时,YARN还支持动态资源分配,能够根据任务的需求和集群的负载情况动态调整资源的分配,提高了集群的响应速度和处理能力。
此外,YARN还提供了丰富的API和插件机制,使得开发者可以根据自己的需求定制资源管理和任务调度的策略,进一步扩展了Hadoop生态系统的功能和应用场景。