【大数据】yarn 任务中的几种状态变化详细过程

一、概述

在YARN中,应用程序和Container的情况改变会影响使命的履行和资源分配。下面是YARN中应用程序和Container的情况具体进程:

1)Application 情况

是指YARN应用程序的情况。每个应用程序都有一个唯一的Application ID,而且能够经过ResourceManager API或YARN Web UI来获取应用程序的当时情况。在YARN中,应用程序情况能够有以下情况:

  1. NEW:应用程序刚创立时的情况。应用程序会被分配一个唯一的Application ID,但还没有分配资源,也没有进入资源行列。

  2. NEW_SAVING:应用程序等候资源保存。这个情况只存在于敞开了Application前史保存的集群上,假如没有保存前史,则该情况的转换不会产生。

  3. SUBMITTED:应用程序现已提交给YARN,并在行列中等候调度资源。在该情况下,YARN只是对应用程序进行了开始的运转时装备,但还没有将任何容器分配到该应用程序。

  4. ACCEPTED:应用程序现现已过行列,并现已分配了它需求的初始和最小容器。

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

  6. FINISHED:应用程序现已成功完结,而且其终究情况现已保存到YARN应用前史中。

  7. FAILED:应用程序运转失利,而且其终究情况现已保存到YARN应用前史中。

  8. KILLED:应用程序已被中止,而且其终究情况现已保存到YARN应用前史中。

2)Container 情况

容器情况指的是在YARN集群上运转的应用程序内部的容器情况。在YARN集群上运转的应用程序是经过发动多个容器来实现的,每个容器都运转着应用程序的一部分(如MapReduce中的一个map或reduce使命),并运用一个或多个资源(如内存、CPU等)来履行使命。当一个应用程序发动后,它的容器情况或许有以下几种:

  1. NEW:Container刚刚创立,但还没有分配资源

  2. LOCALIZED:Container现已获取了运转时环境和所需的资源,表明资源现已被分配给某个容器,但资源还未彻底在该容器上本地化。在容器履行应用程序之前,需求将应用程序所需的资源(如JAR包、装备文件等)拷贝到容器所在的节点上,并在容器内部完结相关装备。完结本地化操作后,容器就能够开始履行应用程序。

  3. RUNNING:Container正在运转,而且现已分配了资源。

  4. COMPLETE:Container现已完结作业并退出。

  5. EXITED_WITH_SUCCESS:表明容器成功履行完毕,而且现已被整理。

  6. EXITED_WITH_FAILURE:表明容器履行失利,而且现已被整理。

NEW 情况到 LOCALIZED 情况,Container 会向 NodeManager 建议本地化恳求,要求 NodeManager 将所需的资源复制到本地磁盘。从 LOCALIZED 情况到 RUNNING 情况,Container会经过发动进程来运转使命。在运转进程中,Container 或许会由于各种原因失利,进入 FAILED 情况。假如Container 顺利完结使命,则进入 COMPLETE 情况。

【大数据】yarn 任务中的几种状态变化详细过程

综上所述,YARN中应用程序和Container的情况改变对于使命的履行和资源分配非常要害。在运用YARN进行使命调度和管理时,需求对不同情况之间的转换有清晰的了解,以保证使命能够顺利运转和完结。

二、资源缺乏情况下情况改变

1)资源缺乏情况下

在YARN中,当资源缺乏时,YARN的资源管理器会对应用程序的情况进行调整,以协助其习惯现有的资源情况。下面是YARN中应用程序情况在资源缺乏的情况下的情况改变:

  • 假如应用程序在 SUBMITTED 情况时,发现资源缺乏,那么应用程序会进入 ACCEPTED情况。在这种情况下,YARN会测验为应用程序分配资源,但或许需求等候其他应用程序释放资源后才能成功分配。

  • 假如应用程序在 ACCEPTED 情况时,发现资源缺乏,那么应用程序会进入等候情况。在等候情况下,应用程序不会分配任何容器,由于资源缺乏无法分配。

  • 假如应用程序在等候情况中,测验重新分配资源,但仍然能够找到空闲资源。在这种情况下,应用程序会返回 ACCEPTED 情况,并成功分配新的容器。

  • 假如应用程序在等候情况中,无法重新分配资源,那么应用程序会转移到 KILLEDFAILED 情况。在这种情况下,应用程序无法分配所需的资源,因而无法完结使命。

2)使命超时时刻装备

使命等候超时时刻:

  • 在YARN中,使命等候资源的超时时刻能够由使命提交者指定(优先级高),而且也能够在应用程序的装备文件(例如mapred-site.xmlyarn-site.xml)中进行设置。超时时刻指定的是使命等候资源的最长时刻,假如在此期间内无法取得所需的资源,则使命将被标记为失利。

  • 在默认情况下,使命等候资源的超时时刻是YARN调度器指定的一个大局值,能够在yarn-site.xml装备文件中进行设置。该大局值的默认值600000毫秒(10分钟)。但也能够针对某个具体使命的特定需求进行调整,办法是在提交使命时构造一个ResourceRequest目标,并指定该目标的超时时刻。

在YARN中,能够经过装备文件设置使命等候资源的超时时刻,其间包含 mapred-site.xmlyarn-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首要由 ResourceManagerNodeManagerApplicationMasterContainer 等组件构成。

【大数据】yarn 任务中的几种状态变化详细过程
当用户给Yarn提交了一个应用程序后,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通讯,要求注销和关闭自己。

这个需求留意的是在整个作业流程傍边,ResourceManagerNodeManager 都是经过心跳保持联系的,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

该指令用于检查指定应用程序的日志。能够运用该指令检查应用程序在运转进程中输出到 STDOUTSTDERR 的一切日志信息。

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 服务,后边有单独解说。

yarn 使命中的几种情况改变具体进程解说就先到这儿了,有任何疑问欢迎给我留言,后续会继续更新相关文章,也可重视我大众号【大数据与云原生技能分享】加群沟通或私信咨询问题~

【大数据】yarn 任务中的几种状态变化详细过程