性能优化 · 大数据运维

待环境验证

YARN 应用排队与资源瓶颈排查

围绕 Hadoop YARN 应用状态、队列配额、AM 资源和节点可放置性进行故障排查,定位资源空闲却无法调度的原因。

Hadoop大数据监控告警
阅读导引 · 理解后再操作

这篇知识解决什么问题

YARN 排队并不总意味着集群资源不够。本篇围绕应用是否得到 AM、队列与用户是否允许继续运行、单个请求能否放入合格节点建立判断顺序;把等待资源与任务执行缓慢分开,才能避免无依据扩容或通过放宽配额影响其他租户。

总空闲不是某个应用的可用配额

应用能够使用的资源受队列层级、用户限制、并发应用和 AM 配额共同约束,还可能只允许在特定标签分区运行。先确认实际生效队列和提交用户,再比较对应范围的余量。全群仪表盘回答总体负载,不能直接回答这个应用何时具备启动资格。

单容器必须放得进一个合格节点

分散在多个节点上的空闲资源不能合并成单个容器所需的内存或 vcores。应把请求规格、最大分配限制、节点健康及放置约束放在一起判断。若 AM 已运行但任务停滞,则还需要框架层执行和下游证据,不能继续只围绕排队额度解释全部耗时。

进入文章正文
关联架构图解8 个组件 · 点击展开

参考图中的 ResourceManager、ApplicationMaster 和 NodeManager 用于区分全局资源调度与单应用执行协调,HDFS 路径用于理解任务的存储依赖。图未展开 CapacityScheduler 队列树、用户限制或节点标签分区,需由实际调度视图补齐。

查看场景架构与实施步骤
参考架构 · 非实时拓扑

HDFS 存储与 YARN 计算的双层架构

把 HDFS 元数据、数据块与 YARN 资源调度分开阅读:客户端直接读写 DataNode,作业由 ApplicationMaster 协调执行;维护需要同时满足数据副本和队列容量条件。

  • 数据 / 请求
  • 控制 / 管理
  • 观测 / 查询

点击组件,在图下方查看职责;连线编号对应流向解读。小屏可横向滚动,或直接展开文字说明。

HDFS 存储与 YARN 计算的双层架构:组件关系图把 HDFS 元数据、数据块与 YARN 资源调度分开阅读:客户端直接读写 DataNode,作业由 ApplicationMaster 协调执行;维护需要同时满足数据副本和队列容量条件。 作业与数据客户端 → NameNode:查询元数据;作业与数据客户端 → DataNode 组:直接读写数据块;NameNode → DataNode 组:块管理指令;作业与数据客户端 → ResourceManager:提交应用;ResourceManager → ApplicationMaster:分配容器资源;ApplicationMaster → NodeManager 组:协调任务执行;Prometheus → NameNode:采集存储状态;Prometheus → ResourceManager:采集队列状态;Grafana → Prometheus:查询趋势。箭头说明见下方流向解读。
逻辑参考图,只展开现有集群的核心职责;主备、JournalNode、机架与副本实例未全部展开,不代表真实部署或维护已验证。

NameNode

控制 / 治理

表示当前有效的 HDFS 元数据入口;实际主备和 JournalNode 健康必须核对。SecondaryNameNode 不能被当作热备。

查看关联工具
全部组件职责 8 个组件
NameNode
表示当前有效的 HDFS 元数据入口;实际主备和 JournalNode 健康必须核对。SecondaryNameNode 不能被当作热备。工具介绍 NameNode
DataNode 组
保存数据块并服务客户端读写,副本和机架放置需按真实拓扑核对;节点退出前评估剩余可用副本。工具介绍 DataNode 组
作业与数据客户端
客户端查询 HDFS 元数据后直接访问 DataNode;YARN 应用提交走独立计算控制路径,不把所有流量都画成经过 NameNode。
ResourceManager
管理计算资源与队列分配;排队还可能受用户配额和请求规格影响,不能仅用总体 CPU 判断。工具介绍 ResourceManager
ApplicationMaster
为本应用申请资源、跟踪任务,并与 NodeManager 协调容器执行;任务管理不由全局调度器单独承担。
Grafana
将主备、容量、块健康和排队原因关联到同一时间范围,给值班人员保留原生命令核对入口。工具介绍 Grafana
Prometheus
通过已验证的指标适配端点采集控制面、存储、计算和关键作业信号;图中仅展示核心入口观测。工具介绍 Prometheus
NodeManager 组
在计算节点管理任务容器及资源状态,维护前应按所选版本流程排空或退出调度,不能只停止进程。工具介绍 NodeManager 组
流向解读 9 条连接
  1. 1

    作业与数据客户端 NameNode

    控制 / 管理 · 查询元数据

    客户端请求文件与块位置元数据,业务数据块本身不流经 NameNode。

  2. 2

    作业与数据客户端 DataNode 组

    数据 / 请求 · 直接读写数据块

    客户端根据元数据访问 DataNode;图中聚合多个数据节点,未展开具体写入复制管线。

  3. 3

    NameNode DataNode 组

    控制 / 管理 · 块管理指令

    NameNode 管理块放置与复制,DataNode 心跳、块报告等返回关系在此简化省略。

  4. 4

    作业与数据客户端 ResourceManager

    控制 / 管理 · 提交应用

    作业提交进入 YARN 控制路径,需核对队列、配额、资源请求和业务窗口。

  5. 5

    ResourceManager ApplicationMaster

    控制 / 管理 · 分配容器资源

    ApplicationMaster 请求资源后由 ResourceManager 返回分配结果,本连线强调调度职责。

  6. 6

    ApplicationMaster NodeManager 组

    控制 / 管理 · 协调任务执行

    ApplicationMaster 与获分配节点的 NodeManager 协调启动及监控任务容器。

  7. 7

    Prometheus NameNode

    观测 / 查询 · 采集存储状态

    通过实际启用的端点或适配器观测角色、容量和块健康,并与原生命令抽样比对。

  8. 8

    Prometheus ResourceManager

    观测 / 查询 · 采集队列状态

    观测队列和应用状态,采集失败与真实资源不足分别呈现。

  9. 9

    Grafana Prometheus

    观测 / 查询 · 查询趋势

    查询存储与计算侧同时间段趋势,为单节点维护提供可复核证据。

故障域与操作边界

一个物理节点可能同时影响两层

DataNode 与 NodeManager 共置时,退出节点会同时减少存储副本与计算容量;不能只看磁盘健康或只看队列资源。

核心角色不明时停止维护

图中未展开的主备、JournalNode 和机架关系仍是前置条件。同故障域不可并行维护,副本或调度不满足时不能强制退出。

副本和快照不是独立备份

数据删除、逻辑损坏与整个故障域受损需要独立恢复路径;全量 fsck、均衡和退役还需另行评估负载。

架构依据与版本核对 2 篇官方资料

图解是本站基于官方资料整理的逻辑参考;实施前仍需核对实际部署版本、组件支持范围与变更审批。

适用范围与前提

本文用于「Hadoop 集群运维」场景,示例依据 Hadoop 3.4.2 与 CapacityScheduler。其他调度器需使用对应配置说明。准备 ResourceManager 访问权限、应用 ID、提交用户、队列、资源请求和任务时限。以下为待环境验证的排查方法,不包含已执行的性能测试或提速承诺。

先区分排队和运行缓慢

yarn application -list -appStates ACCEPTED,RUNNING
yarn application -status 'REPLACE_WITH_APPLICATION_ID'
yarn applicationattempt -list 'REPLACE_WITH_APPLICATION_ID'

把占位符替换为真实应用 ID。记录状态、诊断信息、提交时间及 AM 启动情况。ACCEPTED 重点查看尚未获准运行的原因;RUNNING 但进度不动,需要进入 AM 和任务框架层面,区分等待执行容器、任务重试、数据倾斜和外部存储阻塞。已有状态结论后再收集对应日志,避免一开始下载所有容器日志。

检查队列和用户的约束

yarn queue -status 'REPLACE_WITH_QUEUE_NAME'

将队列结果与 ResourceManager 的调度器视图、实际生效配置对照。检查队列容量上限、用户限制、并发应用限制和 AM 资源占比。CapacityScheduler 中,达到并发或 AM 限制可能让应用停留在 ACCEPTED;因此集群空闲不等于该用户立即可用。具体规则见文末 CapacityScheduler 文档。

记录真正生效的队列路径,尤其注意自动创建队列、父队列继承和节点标签分区。不要只读取某份本地配置文件便认定集群正在使用该值。

检查请求能否放进单个节点

yarn node -list -all
yarn node -status 'REPLACE_WITH_NODE_ID'

用实际节点 ID 替换占位符。检查健康状态、可用内存与 vcores、标签或属性约束及可调度节点范围。所有节点剩余资源之和即使足够,也可能没有一个合格节点能容纳单个容器;应把单容器请求与节点可分配资源、集群和队列的最大分配限制逐一对照。

若只有部分标签节点拥塞,先核对任务是否确实需要该约束。节点健康异常、磁盘问题或维护状态会减少有效容量,应先恢复已确认异常的节点资源。

把问题应用与同队列正常应用进行对照,关注提交用户、单容器大小、标签和提交时段的差异。若相同请求只在某时段排队,继续检查并发高峰;若全天无法分配,更应优先查找配置或放置条件的冲突。

每次只改变一个约束

依据证据选择缩小过大的单容器请求、调整应用并行度、错峰提交,或安排队列容量变更。参数缩小可能增加溢写或失败,必须在代表性任务上验证;增加队列额度则要评估其他租户。优先记录变更前的排队时间、运行时间、失败与资源使用基线,并保留原配置和原提交参数。

验收与回退条件

验收同时看应用是否按时获得 AM、容器是否持续分配、任务是否完成,以及其他队列是否受到影响。使用相同数据规模与输入条件进行比较,把排队和执行时间分别记录,不能用一个任务提前启动证明整体吞吐提升。若失败重试增多、内存不足或邻近队列服务目标受损,恢复本次修改的参数并停止扩大变更。持续排队但证据不足时,保留调度诊断和请求明细,交由调度器负责人复核。

参考资料

从现象到判断

先收集证据,再缩小范围。以下是判读路径,不代表已经确认根因或获准变更。

  1. 应用停留在 ACCEPTED,集群还有空闲,同行业务却能启动;同一用户在高峰时更容易出现这种情况。

    只读核对
    读取应用和 attempt 状态、实际队列路径、用户及 AM 限制,关联 ResourceManager 的现有调度诊断与提交时间。
    如何判读
    优先判断启动资格是否受队列、用户或 AM 条件限制;总体空闲不能反证这些约束,也不能据此直接认定调度异常。
  2. 应用请求总量不大,但长期没有合适节点;可用资源分散,特定标签分区内的节点又处于高水位或异常状态。

    只读核对
    将实际单容器请求与获准节点的可分配资源、标签、健康及最大分配规则逐项对照,限定目标队列和节点范围。
    如何判读
    需要存在满足全部条件的单节点落点;总量相加足够只说明一种粗略容量条件,不能保证容器可以被放置。
  3. 应用已经 RUNNING,却没有明显任务进度,用户把整个耗时都记为排队;同期 HDFS 或外部依赖也有延迟。

    只读核对
    读取已有 AM 和任务状态、容器分配与重试记录,关联相同时间的输入规模、存储错误及下游耗时,不批量下载所有日志。
    如何判读
    应把资源等待、任务执行和依赖阻塞分别计时;AM 已启动不证明执行吞吐正常,也不宜继续用增加队列额度解释。
常见误区与判断边界 2 项

只修改本地配置就认为集群配额改变

客户端文件未必是 ResourceManager 正在使用的配置,队列继承和自动创建规则也会影响实际值。诊断先保存生效视图与配置来源,不能用某份文本推断现网已经采用。任何配额变更还需评估相邻队列与用户目标,不是单个排队应用的局部操作。

缩小容器请求就等于整体提速

更小请求可能更容易放置,却也可能增加溢写、任务失败或重复执行。比较效果必须保持代表性输入与业务条件,分别观察等待、执行和重试,而不是只看开始时间提前。参数试验需另行批准,本篇只提供请求与落点的证据整理。

交接时应留下的证据

作为记录提纲使用,不是自动检查结果;未取得的证据应标记缺口,并注明负责人。

  • 记录应用与 attempt ID、提交用户、实际队列路径、版本和状态时间线,区分提交、获准 AM 及任务执行阶段的耗时。
  • 保存队列和用户限制的生效视图,注明继承、自动队列及节点标签范围,并关联同时间的可用容量和并发应用数量。
  • 列出单容器内存与 vcores、分配上限及合格节点资源,保留不满足放置的具体原因,而不是仅附一张全群空闲图。
  • 交接 AM、任务重试和依赖延迟的已有证据,说明正常应用对照条件、其他租户影响及仍需调度器负责人确认的假设。

记录需包含环境、版本、时间与时区;分享前脱敏,不附访问令牌、密码或完整业务敏感数据。

继续阅读与资料核对

补充相关主题,再结合当前环境的实施记录形成结论。

返回原理导读

DOUYA OPS ECOSYSTEM

贡献你的经验,帮助更多运维人

把故障复盘、标准流程和最佳实践沉淀为可检索、可复用的知识内容。