目录

  • 写在前面
  • 一、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等组件构成。各个组件的作用如下:

  1. ResourceManager(RM):
  • 处理客户端请求
  • 监控NodeManager
  • 启动或监控ApplicationMaster
  • 资源的分配与调度
  1. NodeManager(NM):
  • 管理单个节点上的资源
  • 处理来自ResourceManager的命令
  • 处理来自ApplicationMaster的命令
  1. ApplicationMaster(AM):
  • 为应用程序申请资源并分配给内部的任务
  • 任务的监控与容错
  1. Container
  • Container是yarn中的资源抽象,它封装了某个节点上的多维度资源,如内存、cpu、磁盘、网络等

1.2 Yarn工作机制

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. 资源分配:当一个应用程序提交到集群时,调度器根据应用程序所需的资源量和队列的最大可用资源容量,决定要分配给该应用程序的资源。
  2. 资源预留:一旦资源分配完成,调度器为应用程序保留分配给它的资源。这意味着其他的应用程序不能使用这些资源,直到分配给该应用程序的任务完成或者释放了资源。
  3. 队列优先级:在有多个队列的情况下,调度器会根据队列之间的优先级,决定分配资源的顺序。高优先级队列的应用程序将获得更多的资源。
  4. 资源回收:当一个应用程序的任务完成或者释放了资源,调度器将重新分配这些资源给其他的等待中的应用程序。

1.4.3 公平调度器(Fair Scheduler)

Fair调度器是YARN中常用的一种调度器,它旨在公平地共享集群资源,避免其中一个应用程序垄断资源。

Fair调度器基于公平共享的原则,根据各个应用程序的需求和优先级,动态地分配集群资源。在Fair调度器中,所有的应用程序被视为同等重要,每个应用程序都有一定的权重。调度器会根据应用程序的权重和资源需求来分配资源,以达到公平和均衡的资源分配。

Fair调度器的工作流程如下:

  1. 资源分配:当一个应用程序提交到集群时,调度器根据应用程序的权重和资源需求,动态地计算出所分配的资源数量。
  2. 资源预留:资源分配完成后,调度器为应用程序保留分配给它的资源。这意味着其他的应用程序不能使用这些资源,直到分配给该应用程序的任务完成或者释放了资源。
  3. 队列公平性:在有多个应用程序等待资源的情况下,调度器会根据各个应用程序的权重和公平共享的原则,确定资源分配的顺序。权重较高的应用程序将获得更多的资源。
  4. 动态调整:随着时间的推移和各个应用程序的资源需求变化,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生态系统的功能和应用场景。