一、概述

1、Yarn基本概念

YARN(Yet Another Resource Negotiator)是Hadoop 2.x的一个计算框架,旨在解决Hadoop 1.x中的资源管理和任务调度问题。它的主要目的是将MR1 JobTracker 的两个主要功能(资源管理和作业调度/监控)分离,以便更好地支持多种应用程序,而不是仅支持MapReduce。

YARN采用了全新的架构,包括ResourceManager、NodeManager和ApplicationMaster等组件。其中,ResourceManager负责整个集群中的资源分配,NodeManager负责管理并监控节点上的容器,ApplicationMaster是一个Yarn的客户端,用于管理当前任务的调度。

ResourceManager(RM)

  • 负责整个系统的资源管理和分配,包括处理客户端请求、启动/监控APP master、监控nodemanager、资源的分配与调度
  • Scheduler: 根据容量、队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统中的资源分配给各个正在运行的应用程序。Yarn提供了多种直接可用的调度器,比如FIFO Scheduler、Fair Scheduler和Capacity Scheduler等。
  • Applications Manager: 负责管理整个系统中所有应用程序,包括应用程序提交、与调度器协商资源以启动ApplicationMaster、监控ApplicationMaster运行状态并在失败时重新启动它等。

NodeManager(NM)

  • 负责接收处理来自ResourceManager的资源分配请求,分配具体的Container给应用
  • 它还负责监控并报告Container使用信息给ResourceManager
  • Container是一个动态资源分配单位,它将内存、cpu、磁盘、网络等资源封装在一起,从而限定每个任务使用的资源量
  • NodeManager只负责管理自身的Container,它并不知道运行在它上面应用的信息。负责管理应用信息的组件是ApplicationMaster

ApplicationMaster

  • 应用程序级别的,运行在Container中,管理运行在YARN上的应用程序。
  • 向ResourceManager申请资源
  • 和NodeManager协同工作来运行应用的各个任务
  • 与NodeManager通信以启动或停止任务
  • 监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务

2、任务管理及资源管理

通过YARN的任务管理,可以将任务分配到不同的容器中,运行在不同的节点上,以满足任务的不同需求。通过任务分配、任务监控和任务状态跟踪等方式,确保应用程序能够在集群中顺利运行。

同时,YARN的资源管理模块负责管理Master和slave节点的资源,包括CPU、内存和磁盘等资源。通过YARN的资源管理,可以实现有效的资源池管理,通过实现资源调度和资源分配策略,使得不同应用程序能够充分利用集群资源,优化集群的性能。

因此,YARN的任务管理和资源管理至关重要。接下来我们详细介绍yarn的任务管理及资源管理。

二、任务管理

1、任务运行流程

当用户向YARN中提交一个应用程序后,YARN将分两个阶段运行该应用程序:第一个阶段是启动ApplicationMaster;第二个阶段是由ApplicationMaster创建应用程序,为它申请资源,并监控它的整个运行过程,直到运行完成,如下图所示。

(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中的任务将其进度和状态返回给应用管理器, 客户端每秒(通过mapreduce.client.progressmonitor.pollinterval设置)向应用管理器请求进度更新, 展示给用户。

(6)作业完成

除了向应用管理器请求作业进度外, 客户端每5秒都会通过调用waitForCompletion()来检查作业是否完成。时间间隔可以通过mapreduce.client.completion.pollinterval来设置。作业完成之后, 应用管理器和Container会清理工作状态。作业的信息会被作业历史服务器存储以备之后用户核查。

2、任务状态跟踪和监控

在任务运行过程中,YARN使用ApplicationMaster来跟踪和管理任务的状态,ApplicationMaster可以定期向ResourceManager汇报任务的状态,从而实现状态跟踪。此外,可以通过定期监控Container的状态,了解任务的运行情况和状态。

下面是YARN中应用程序和Container的状态详细过程:

(1)Application 状态

是指YARN应用程序的状态。每个应用程序都有一个唯一的Application ID,并且可以通过ResourceManager API或YARN Web UI来获取应用程序的当前状态。在YARN中,应用程序状态可以有以下状态:

NEW:应用程序刚创建时的状态。应用程序会被分配一个唯一的Application ID,但还没有分配资源,也没有进入资源队列。

NEW_SAVING:应用程序等待资源保存。这个状态只存在于开启了Application历史保存的集群上,如果没有保存历史,则该状态的转换不会发生。

SUBMITTED:应用程序已经提交给YARN,等待调度器处理,****尚未进行资源分配。

调度器会根据调度算法和优先级等因素,从队列中选择合适的应用程序并为其分配资源。调度器会考虑集群中的负载情况,保证资源的合理利用和公平共享。调度器完成后,应用程序的状态将被更新为”ACCEPTED”

ACCEPTED:应用程序已经通过队列,并ResourceManager已经分配了它需要的初始和最小容器( 这只是一个预分配的过程,并不代表资源已经真正分配给了应用程序)。

应用程序已通过队列,并为其分配了初始和最小容器,但实际的计算资源尚未分配

RUNNING:应用程序正在运行中,并具有正在运行的容器。

应用程序已获得实际的计算资源分配,并开始执行任务

FINISHED:应用程序已经成功完成,并且其最终状态已经保存到YARN应用历史中。

FAILED:应用程序运行失败,并且其最终状态已经保存到YARN应用历史中。

KILLED:应用程序已被终止,并且其最终状态已经保存到YARN应用历史中。

示例:

  • application_1687214371118_29142:
  • 第一次查询时,任务状态为ACCEPTED,这个状态表示任务已经被ResourceManager接受并等待资源分配
  • 等待资源分配的原因,可以是没有可用资源了,也可能是正在对任务进行一些准备工作,例如检查任务的依赖关系、资源需求等。这些准备工作可能需要一些时间。
  • 一旦适当的资源可用,并且所有准备工作完成,任务将从ACCEPTED状态转换为RUNNING状态,并开始在相应的容器中运行
资源不足情况下状态变化

当资源不足时,YARN的资源管理器会对应用程序的状态进行调整,以帮助其适应现有的资源情况。下面是YARN中应用程序状态在资源不足的情况下的状态变化:

  • 如果应用程序在 SUBMITTED 状态时,发现资源不足,那么应用程序会进入 ACCEPTED****状态。在这种情况下,YARN会尝试为应用程序分配资源,但可能需要等待其他应用程序释放资源后才能成功分配。
  • 如果应用程序在 ACCEPTED 状态时,发现资源不足,那么应用程序会进入等待状态。在等待状态下,应用程序不会分配任何容器,因为资源不足无法分配。
  • 如果应用程序在等待状态中,尝试重新分配资源,但仍然可以找到空闲资源。在这种情况下,应用程序会返回 ACCEPTED 状态,并成功分配新的容器。
  • 如果应用程序在等待状态中,无法重新分配资源,那么应用程序会转移到 KILLED 或 FAILED 状态。在这种情况下,应用程序无法分配所需的资源,因此无法完成任务。

(2)Container 状态

指的是在YARN集群上运行的应用程序内部的container状态。在YARN集群上运行的应用程序是通过启动多个container来实现的,每个container都运行着应用程序的一部分(如MapReduce中的一个map或reduce任务),并使用一个或多个资源(如内存、CPU等)来执行任务。当一个应用程序启动后,它的容器状态可能有以下几种:

  • NEW:Container刚刚创建,但还没有分配资源。
  • LOCALIZED:Container已经获取了运行时环境和所需的资源,表示资源已经被分配给某个容器,但资源还未完全在该容器上本地化。在容器执行应用程序之前,需要将应用程序所需的资源(如JAR包、配置文件等)拷贝到容器所在的节点上,并在容器内部完成相关配置。完成本地化操作后,容器就可以开始执行应用程序。
  • RUNNING:Container正在运行,并且已经分配了资源。
  • COMPLETE:Container已经完成工作并退出。
  • EXITED_WITH_SUCCESS:表示容器成功执行完毕,并且已经被清理。
  • EXITED_WITH_FAILURE:表示容器执行失败,并且已经被清理。

从 NEW 状态到 LOCALIZED 状态,Container 会向 NodeManager 发起本地化请求,要求 NodeManager 将所需的资源复制到本地磁盘。从 LOCALIZED 状态到 RUNNING 状态,Container会通过启动进程来运行任务。在运行过程中,Container 可能会由于各种原因失败,进入 FAILED 状态。如果Container 顺利完成任务,则进入 COMPLETE 状态。

(3)Yarn任务监控

Yarn提供了丰富的任务监控和管理功能,可以实时监控和管理Yarn集群中的任务,并及时采取必要的措施来优化性能、发现问题和确保任务的顺利执行。以下是一些常见的Yarn任务监控方法:

Yarn Web UI:Yarn的Web界面是一个强大的任务监控工具。通过访问Yarn的Web UI地址,可以查看整个集群上运行的应用程序、任务的执行状态、资源分配情况等详细信息。可以通过该界面来监视任务的进度、资源使用情况和容器的状态。

Yarn命令行界面(CLI):Yarn提供了一组命令行工具,可以用于查看和管理任务。例如:

  • “yarn application -list”命令可以列出集群上正在运行的应用程序及其状态;
  • “yarn application -status <application_id>”命令可获取特定应用程序的详细状态信息;
  • “yarn logs -applicationId <application_id>”命令可查看应用程序日志等。

Yarn REST API:Yarn还提供了REST API接口,允许通过发送HTTP请求来获取任务的状态和其他相关信息。可以使用HTTP客户端(如curl、Postman)向适当的API端点发送请求,并解析响应以获取任务的监控数据。

curl -X GET http://localhost:8088/ws/v1/cluster/apps/<application_id>/state