资源管理器——YARN

资源管理器——YARN

基本概念

YARN是Hadoop的一个资源管理器,负责为运算程序提供相关资源。

YARN架构

YARN的架构设计基于主从(Master-Slave)模式。
主要由ResourceManager(RM)和NodeManager(NM)两大部分组成。
除此之外,还有ApplicationMaster(AM)、Container等组件辅助实现所有功能。

RersouceManger

ResourceManager(RM)是一个全局的资源管理器,在集群中有且只有一个。
ResourceManager(RM)负责整个Hadoop集群的资源管理和分配。包括处理客户端请求、启动监控ApplicationMaster(AM)、监控NodeManager(NM)、资源的分配与调度等。
它主要由ApplicationsManager(应用程序管理器,AsM)和Scheduler(调度器)两个组件构成。

ApplicationsManager

ApplicationsManager(应用程序管理器)负责管理整个集群中的所有应用程序。包括应用程序的提交、与调度器协商资源、启动ApplicationMaster(AM)、监控ApplicationMaster(AM)运行状态并在失败时重新启动它等。
它的主要功能如下:
负责接收用户提交的任务请求,为应用分配第一个Container(容器),此Container(容器)用来运行ApplicationMaster(AM)
负责监控ApplicationMaster(AM)的运行状态,如果发现ApplicationMaster失败,会自动重启ApplicationMaster运行的Container(容器)。

Scheduler

Scheduler是一个集群资源调度器。根据集群的容量、队列等限制条件,将集群中的资源分配给各个正在运行的应用程序,以保障整个集群高效、合理地使用资源。
需要注意的是:Shedular是一个纯粹的资源调度管理器,它只负责调度Containers(容器),不用关心任何与具体应用程序相关的工作。例如,它不会监控或者跟踪应用的执行状态,也不会去重启因程序失败或其它错误而运行失败的任务。
调度器仅根据每个应用程序的资源需求进行合理分配。而资源分配的单位用Container(容器)表示。Container(容器)是一个动态资源分配单位,它将CPU和内存封装起来,从而限定每个任务使用的资源量。
在Hadoop中,YARN提供了多种直接可用的Scheduler(调度器)。常用的Scheduler(调度器)主要有两种:
CapacityScheduler
FairScheduler
第一个是基于容量的资源调度,第二个是基于公平的资源调度,这里仅作了解。

ApplicationMaster

当用户提交一个应用程序时,ApplicationMaster(AM)进程会率先被启动。ApplicationMaster(AM)负责协调来自ResourceManager的资源,并通过NodeManager监控Container(容器)资源内的使用情况。同时它还会跟踪监视任务的执行状态。
当遇到失败的任务时会自动重启它。当任务执行完成后,ApplicationMaster会关闭自己并释放自己的容器。
可以看出,ApplicationMaster就像一个全职保姆,它负责任务执行的始末,全程保障任务的执行效果。
总体来说,ApplicationMaster(AM)执行过程是按照如下顺序进行的:
1.ApplicationMaster(AM)切分数据,并对任务进行分片;
2.ApplicationMaster(AM)向ResourceManager申请资源,然后将申请下来的资源交给NodeManager;
3.监控任务的运行,并对错误任务进行重启;
4.通过NodeManager监控任务的执行和资源使用情况。

NodeManager

NodeManager(NM)负责资源的供给和隔离。它运行在集群中的多个计算节点上,与HDFS中DataNode的角色类似,每个计算节点都运行一个NodeManager。
它的主要功能如下:
启动时向ResourceManager注册并定时发送心跳信息,等待ResourceManager的指令;
接收并处理来自ApplicationMaster的Container(容器)启动、停止等请求;
管理本节点上Container(容器)的使用情况;
定时向ResourceManager汇报本节点上的资源使用情况以及各个Container(容器)的运行状态。
需要注意的是,NodeManager只负责管理自身的Container(容器),不会去关注Container(容器)中运行的任务。

Container

Container(容器)是最底层的计算单元,所有应用程序都是在Container(容器)中执行计算任务的。Map Task、Reduce Task都是在Container(容器)中执行。
一个节点根据资源的不同,可以运行一个或多个Container(容器)。一个Container(容器)就是一组分配的系统资源。
在现阶段,Container(容器)的系统资源只包含CPU和内存两种,未来可能会增加磁盘、网络等资源。
在YARN中ApplicationMaster会跟ResourceManager申请资源,而ResourceManager只会告诉ApplicationMaster哪些Container可以用。如果要使用这些资源,ApplicationMaster还需要去找NodeManager请求分配具体的Container。
任何一个job或者application最终都是在一个或多个Container(容器)中完成分析计算任务的。

YARN工作流程

当用户向YARN提交一个请求时,YARN会执行一系列的动作来响应用户的请求。具体如下:

  1. Client向YARN提交应用请求,ResourceManager响应用户的请求;
  2. ApplicationManager选取一个NodeManager进行通信,启动第一个Container,并在Container中运行的ApplicationMaster(AM)实例;
  3. ApplicationMaster向ResourceManager注册,并向ResourceManager申请运行该应用程序所需的资源;
  4. Scheduler将封装好的资源放送给ApplicationMaster;
  5. ApplicationMaster申请到资源之后,与对应的NodeManager通信,要求启动Container,在Containaer中执行Map Task、Reduce Task等具体任务;
  6. 各个任务之间通过RPC协议向ApplicationMaster汇报自己的状态和进度,以此方式让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务;
  7. ApplicationMaster将任务执行结果返回给ApplicationManager,并在应用程序运行完成后向ApplicationManager注销并关闭自己。

YARN Client和 YARN Cluster

YARN Client和YARN Cluster模式的区别其实就是Application Master进程的区别。
在YARN Cluster模式下,Driver运行在AM(Application Master)中,Application Master负责向YARN申请资源,并监督作业的运行状况。当用户提交了作业之后,就可以关掉Client,作业会继续在YARN上运行。
在YARN Client模式下,Driver运行在本地,Application Master仅仅向YARN请求executor,Client会和请求的Container通信来调度它们工作。当用户提交了作业之后,一旦关掉Client,作业会停止。

YARN调度器

可以在配置文件yarn-site.xml中配置相关调度器。

FIFO调度器

特点:单队列,根据提交作业的先后顺序,先来先服务。
优点:先进先出。
缺点:不支持多队列,生产环境很少使用。

容量调度器

特点
多队列:每个队列可以配置一定的资源量。每个队列采用FIFO调度策略。
容量保证:管理员可以为每个队列设置资源最低保证和资源使用上线。
灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有了新的应用程序提交,则其它队列借调的资源会归还给该队列。
多租户:支持多用户共享集群和多应用程序同时运行。为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。

Apache Hadoop3.2.1默认的资源调度器是Capacity Scheduler。

公平调度器

与容量调度器大致相同。
相同点:
多队列、容量保证、灵活性、多租户
不同点:
核心调度策略不同。容量调度器会优先选择资源利用率低的队伍,而公平调度器会优先选择对资源的缺额比例比较大的。

YARN常用Shell命令

在YARN中,提供了一些Shell命令对job或者application进行管理,还可以查看节点状态、队列状态、分析任务日志、重载刷新YARN配置等。下面是具体示例:

yarn application命令

通过yarn application管理命令可以对运行的任务进行状态查看、关闭application或启动application等操作。

查看集群中正在运行的application

1
2
3
4
[root@bd12 ~]# yarn application -list
Total number of applications (application-types: [], states: [SUBMITTED, ACCEPTED, RUNNING] and tags: []):1
Application-Id   Application-Name   Application-Type   User  Queue   State     Final-State    Progress            Tracking-URL
application_1591585111972_0080  NgLogStreamService     Apache Flink    root root.users.root     RUNNING      UNDEFINED 100%          http://bd14:50101

查看指定application状态信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@bd12 ~]# yarn application -status application_1591585111972_0080
Application Report : 
Application-Id : application_1591585111972_0080
Application-Name : NgLogStreamService
Application-Type : Apache Flink
User : root
Queue : root.users.root
Application Priority : 0
Start-Time : 1591925532263
Finish-Time : 0
Progress : 100%
State : RUNNING
Final-State : UNDEFINED
Tracking-URL : http://bd14:50101
RPC Port : 50101
AM Host : bd14
Aggregate Resource Allocation : 2967532741 MB-seconds, 2897979 vcore-seconds
Aggregate Resource Preempted : 0 MB-seconds, 0 vcore-seconds
Log Aggregation Status : NOT_START
Diagnostics : 
Unmanaged Application : false
Application Node Label Expression : <Not set>
AM container Node Label Expression : <DEFAULT_PARTITION>
TimeoutType : LIFETIME ExpiryTime : UNLIMITED RemainingTime : -1seconds

kill掉指定application

1
2
3
4
5
6
[root@bd12 ~]# yarn application -kill application_1591585111972_0080
##获取application尝试的列表
[root@bd12 ~]# yarn applicationattempt -list application_1591585111972_0080
Total number of application attempts :1
     ApplicationAttempt-Id        State           AM-Container-Id            Tracking-URL
appattempt_1591585111972_0080_000001       RUNNING container_e34_1591585111972_0080_01_000001 http://bd12:8088/proxy/application_1591585111972_0080/

yarn node命令

通过yarn node命令可以查看集群中的节点状态。

查看集群中活跃的节点

1
2
3
4
5
6
[root@bd12 ~]# yarn node -list
Total Nodes:3
     Node-Id   Node-State Node-Http-Address Number-of-Running-Containers
    bd14:8041     RUNNING     bd14:8042              1
    bd13:8041     RUNNING     bd13:8042              0
    bd15:8041     RUNNING     bd15:8042              2

查看指定节点的状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@bd12 ~]# yarn node -status bd13:8041
Node Report : 
Node-Id : bd13:8041
Rack : /default
Node-State : RUNNING
Node-Http-Address : bd13:8042
Last-Health-Update : Tue 23/Jun/20 02:06:28:437CST
Health-Report : 
Containers : 0
Memory-Used : 0MB
Memory-Capacity : 7168MB
CPU-Used : 0 vcores
CPU-Capacity : 8 vcores
Node-Labels : 
Resource Utilization by Node : PMem:2862 MB, VMem:2863 MB, VCores:0.12329224
Resource Utilization by Containers : PMem:0 MB, VMem:0 MB, VCores:0.0

yarn queue命令

通过yarn queue命令可以查看集群中的队列资源信息。

1
2
3
4
5
6
7
8
9
[root@bd12 ~]# yarn queue -status root.users.root
Queue Information : 
Queue Name : root.users.root
State : RUNNING
Capacity : 100.0%
Current Capacity : 14.3%
Maximum Capacity : -100.0%
Default Node Label expression : <DEFAULT_PARTITION>
Accessible Node Labels :

可以看出,root.users.root队列占用集群总容量的100%(因为当前集群只有这一个队列),目前已经使用的容量是14.3%(上一个参数而言)。
Maximum Capacity是Capacity Scheduler调整策略的参数,在这里无效。

yarn rmadmin命令

通过yarn rmadmin命令可以刷新配置。
如果对资源队列做了修改,或者新增了计算节点,或修改了YARN配置文件,那么在不重启YARN服务的前提下,我们可以使用yarn rmadmin命令来使配置立刻生效。

可选参数如下:

  • -refreshQueues 重载队列的ACL、状态和调度器等属性,RM将重新加载queue配置文件
  • -refreshNodes 用来刷新dfs.hosts和dfs.hosts.exclude配置文件,这种方式无需重启集群服务
  • -refreshSuperUserGroupsConfiguration 刷新用户组配置

刷新节点

1
yarn rmadmin -refreshNodes

yarn logs命令

通过yarn logs命令可以查看application、container的运行日志。

查看指定application的运行日志

1
[root@bd12 ~]# yarn logs -applicationId application_1591585111972_0080

查看指定application下面指定的container容器的运行日志

1
[root@bd12 ~]# yarn logs -applicationId application_1591585111972_0080 -containerId container_e34_1591585111972_0080_01_000001
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2015-2023 henrrywan

请我喝杯咖啡吧~

支付宝
微信