一、概述
在YARN中,应用程序和Container的状态变化会影响任务的执行和资源分配。下面是YARN中应用程序和Container的状态详细过程:
1)Application 状态
是指YARN应用程序的状态。每个应用程序都有一个唯一的Application ID,并且可以通过ResourceManager API或YARN Web UI来获取应用程序的当前状态。在YARN中,应用程序状态可以有以下状态:
- NEW:应用程序刚创建时的状态。应用程序会被分配一个唯一的Application ID,但还没有分配资源,也没有进入资源队列。
- NEW_SAVING:应用程序等待资源保存。这个状态只存在于开启了Application历史保存的集群上,如果没有保存历史,则该状态的转换不会发生。
- SUBMITTED:应用程序已经提交给YARN,并在队列中等待调度资源。在该状态下,YARN只是对应用程序进行了初步的运行时配置,但还没有将任何容器分配到该应用程序。
- ACCEPTED:应用程序已经通过队列,并已经分配了它需要的初始和最小容器。
- RUNNING:应用程序正在运行中,并具有正在运行的容器。
- FINISHED:应用程序已经成功完成,并且其最终状态已经保存到YARN应用历史中。
- FAILED:应用程序运行失败,并且其最终状态已经保存到YARN应用历史中。
- KILLED:应用程序已被终止,并且其最终状态已经保存到YARN应用历史中。
2)Container 状态
容器状态指的是在YARN集群上运行的应用程序内部的容器状态。在YARN集群上运行的应用程序是通过启动多个容器来实现的,每个容器都运行着应用程序的一部分(如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 状态。
综上所述,YARN中应用程序和Container的状态变化对于任务的执行和资源分配非常关键。在使用YARN进行任务调度和管理时,需要对不同状态之间的转换有清晰的理解,以确保任务能够顺利运行和完成。
二、资源不足情况下状态变化
1)资源不足情况下
在YARN中,当资源不足时,YARN的资源管理器会对应用程序的状态进行调整,以帮助其适应现有的资源情况。下面是YARN中应用程序状态在资源不足的情况下的状态变化:
- 如果应用程序在 SUBMITTED 状态时,发现资源不足,那么应用程序会进入 ACCEPTED状态。在这种情况下,YARN会尝试为应用程序分配资源,但可能需要等待其他应用程序释放资源后才能成功分配。
- 如果应用程序在 ACCEPTED 状态时,发现资源不足,那么应用程序会进入等待状态。在等待状态下,应用程序不会分配任何容器,因为资源不足无法分配。
- 如果应用程序在等待状态中,尝试重新分配资源,但仍然可以找到空闲资源。在这种情况下,应用程序会返回 ACCEPTED 状态,并成功分配新的容器。
- 如果应用程序在等待状态中,无法重新分配资源,那么应用程序会转移到 KILLED 或 FAILED 状态。在这种情况下,应用程序无法分配所需的资源,因此无法完成任务。
2)任务超时时间配置
任务等待超时时间:
- 在YARN中,任务等待资源的超时时间可以由任务提交者指定(优先级高),并且也可以在应用程序的配置文件(例如mapred-site.xml或yarn-site.xml)中进行设置。超时时间指定的是任务等待资源的最长时间,如果在此期间内无法获得所需的资源,则任务将被标记为失败。
- 在默认情况下,任务等待资源的超时时间是YARN调度器指定的一个全局值,可以在yarn-site.xml配置文件中进行设置。该全局值的默认值是600000毫秒(10分钟)。但也可以针对某个具体任务的特定需求进行调整,方法是在提交任务时构造一个ResourceRequest对象,并指定该对象的超时时间。
在YARN中,可以通过配置文件设置任务等待资源的超时时间,其中包括 mapred-site.xml 和 yarn-site.xml 两个文件。
1、yarn-site.xml 文件中配置超时时间
在 yarn-site.xml 文件中,可以设置以下两个参数来控制任务等待资源的超时时间:
- yarn.nodemanager.resource.timeout-ms:这个参数定义了节点管理器等待应用程序可能需要的资源的最长时间。如果等待时间超过此限制,则节点管理器会杀死该应用程序。默认值为10分钟(600000毫秒)。
- yarn.resourcemanager.resource-tracker.client.thread-count:这个参数定义了资源管理器向节点管理器发送请求的线程数。通过增加这个参数,可以提高资源管理器向节点管理器发送请求的并发性能,从而减少任务等待的时间。
2、mapred-site.xml 文件中配置超时时间
在 mapred-site.xml 文件中,可以设置以下参数来控制 MapReduce 作业等待资源的超时时间:
- mapreduce.client.completion.pollinterval:这个参数定义了客户端轮询作业的完成状态的时间间隔。默认值为5000毫秒。
- mapreduce.client.progressmonitor.pollinterval:这个参数定义了客户端轮询作业的进度状态的时间间隔。默认值为1000毫秒。
在这两个文件中,都可以使用默认值,也可以根据实际需求进行调整。当然也可以在程序中设定超时时间,示例代码如下:
ResourceRequest resReq = Records.newRecord(ResourceRequest.class);
resReq.setResourceName(capability.getResourceName());
resReq.setCapability(capability);
resReq.setNumContainers(numContainers);
resReq.setRelaxLocality(relaxLocality);
resReq.setPriority(priority);
//设置最长等待时间为30分钟,即1800000毫秒
resReq.setTimeout(1800000);
appAttemptID.setAttemptId(appAttemptNumber);
amClient.addContainerRequest(resReq);
综上所述,在应用程序和资源的状态变化中,资源不足是一个常见的问题。在处理这种情况时,YARN会对应用程序的状态进行调整,以尽可能适应现有的资源情况。在使用YARN进行任务调度和管理时,需要注意资源分配情况,并根据实际情况进行调整,以确保任务能够顺利运行和完成。
三、环境准备
如果已经有了环境了,可以忽略,如果想快速部署环境进行测试可以参考我这篇文章:通过 docker-compose 快速部署 Hive 详细教程
# 登录容器
docker exec -it hive-hiveserver2 bash
# 连接hive
beeline -u jdbc:hive2://hive-hiveserver2:10000 -n hadoop
四、Yarn 工作流程
YARN主要由 ResourceManager、NodeManager、ApplicationMaster 和 Container 等组件构成。
当用户给Yarn提交了一个应用程序后,Yarn的主要工作流程如下图:
- 【步骤1】用户向Yarn提交应用程序,其中包括用户程序、相关文件、启动 ApplicationMaster 命令、 ApplicationMaster程序等。
- 【步骤2】ResourceManager为该应用程序分配第一个Container,并且与Container所在的NodeManager通信,并且要求该NodeManager在这个Container中启动应用程序对应的ApplicationMaster。
- 【步骤3】ApplicationMaster 首先会向 ResourceManager 注册,这样用户才可以直接通过 ResourceManager 查看到应用程序的运行状态,然后它为准备为该应用程序的各个任务申请资源,并监控它们的运行状态直到运行结束,即重复后面4~7步骤。
- 【步骤4】ApplicationMaster 采用轮询的方式通过 RPC 协议向 ResourceManager 申请和领取资源。
- 【步骤5】一旦 ApplicationMaster 申请到资源后,便会与申请到的 Container 所对应的 NodeManager 进行通信,并且要求它在该Container中启动任务。
- 【步骤6】任务启动。NodeManager 为要启动的任务配置好运行环境,包括环境变量、JAR包、二进制程序等,并且将启动命令写在一个脚本里,通过该脚本运行任务。
- 【步骤7】各个任务通过 RPC 协议向其对应的 ApplicationMaster 汇报自己的运行状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以再任务运行失败时重启任务。
- 【步骤8】应用程序运行完毕后,其对应的ApplicationMaster会向ResourceManager通信,要求注销和关闭自己。
这个需要注意的是在整个工作流程当中,ResourceManager 和 NodeManager 都是通过心跳保持联系的,NodeManager 会通过心跳信息向 ResourceManager 汇报自己所在节点的资源使用情况。
五、Yarn 常用命令
下面是YARN常用命令的一些示例:
1)查看应用程序
# 查看在运行的任务
yarn application -list
# 查看所有任务
yarn application -list -appStates ALL
# 状态值:ALL,NEW,NEW_SAVING,SUBMITTED,ACCEPTED,RUNNING,FINISHED,FAILED,KILLED
该命令用于显示当前正在运行中的所有应用程序的列表,包括应用程序ID、名称、用户、队列、开始时间、结束时间、状态等信息。
- 查看YARN应用程序的状态:
yarn application -status <Application ID>
# 示例:
yarn application -status application_1683209715059_0002
该命令用于查看指定 Application ID 的应用程序的状态。可以查看应用程序的名称、用户、队列、开始时间、结束时间、状态、进度等信息。
3)查看指定应用程序的日志
yarn logs -applicationId <Application ID>
#示例:
yarn logs -applicationId application_1683209715059_0002
该命令用于查看指定应用程序的日志。可以使用该命令查看应用程序在运行过程中输出到 STDOUT 和STDERR 的所有日志信息。
4)查看NodeManager ID
使用以下命令查看YARN集群中所有NodeManager的状态:
yarn node -list
该命令将显示所有NodeManager节点的状态,包括主机名,HTTP地址,状态,容器数量等信息。
5)查看指定NodeManager的日志
# 查看<Application ID>
yarn application -list -appStates ALL
# 查看<NodeManager ID>
yarn node -list
# 再查看日志
yarn logs -applicationId <Application ID> -nodeId <NodeManager ID>
# 示例:
yarn logs -applicationId application_1683209715059_0002 hadoop-yarn-nm-0:40140
该命令用于查看指定NodeManager上指定应用程序的日志。可以使用该命令查看节点管理器(NodeManager)在运行过程中输出到 STDOUT 和 STDERR 的所有日志信息。
6)杀死指定应用程序
# 查看在运行的任务
yarn application -list
# kill 任务
yarn application -kill <Application ID>
# 示例:
yarn application -kill application_1683209715059_0002
该命令用于杀死指定 Application ID 的应用程序。如果应用程序正在运行,则它将被强制终止并结束。
7)服务启停命令
1、启停YARN服务
# 包括RM,NM,启动
start-yarn.sh
# 停止
stop-yarn.sh
2、启停YARN resourcemanager、NM服务
# 启动 resourcemanager
yarn --daemon start resourcemanager
# 停止 resourcemanager
yarn --daemon stop resourcemanager
# 启动 nodemanager
yarn --daemon start nodemanager
# 停止 nodemanager
yarn --daemon stop nodemanager
# 指定日志级别,有 DEBUG、INFO、WARN、ERROR等级别。
#示例:
yarn --loglevel DEBUG --daemon start resourcemanager
8)启停YARN proxyserver 服务
YARN Proxy可以让您通过Web界面对集群进行监视和管理,而不必直接连接到每个节点。YARN Proxy服务是一个Web代理服务器,运行在YARN集群之外,并提供对集群资源管理器和节点管理器的访问。您可以通过代理访问Web界面,查看群集使用情况和任务执行状况。
yarn --daemon start proxyserver
这里就不展开讲解YARN proxyserver 服务,后面有单独讲解。