接手一套YARN集群,不管你是开发、运维还是刚入门的大数据萌新,第一件事基本都是把ResourceManager的8088页面点一遍。这个UI界面是集群对外最直观的“仪表盘”,任务跑没跑起来、资源够不够、哪个节点挂了、哪个队列在排队,全都能在上面看到。但很多人只是大概扫一眼数字,真遇到任务卡死、Container反复失败、队列不分配资源的时候,根本不知道怎么从页面上找线索。这篇就把YARN集群UI界面彻底拆开讲,从菜单结构到每个指标含义,再到怎么用它定位真实问题,一次性聊透。
1. 整体设计思路:YARN集群UI界面到底在“画”什么
1.1 界面的定位:为什么YARN需要这个Web控制台
YARN是Hadoop生态里的资源调度层,负责把CPU、内存、磁盘这些资源分给一个个作业。但是资源是“看不见摸不着”的,任务在集群上跑,你不能直接跑到每台机器上ps aux看是不是自己跑的东西,那样既不现实也不优雅。YARN的UI界面就是把这些抽象的资源分配和任务调度过程,翻译成人能看懂的信息——哪个应用在跑、跑在哪个节点、申请了多少资源、占用了多少、剩余多少、排队的还有多少。
这个界面解决的根本问题,就是“黑盒问题”。没它的时候,你只能靠猜:任务为什么慢?可能节点负载高,可能队列配额不够,可能磁盘坏了一块。有了UI之后,这些信息被显式地暴露出来,你不需要SSH到每一台机器上去翻日志,首页一张表就把集群健康状况摆在你面前。
1.2 核心菜单结构:主页面导航都在说什么
进入ResourceManager的Web UI(默认是http://<RM主机名>:8088),顶部就是主菜单栏。第一次看可能觉得菜单很多,其实核心就这几个:
- Applications:所有运行中和已结束任务的列表。这是你平时点得最多的页面。
- Nodes:所有NodeManager节点状态总览。哪个节点活着、哪个节点挂了、各自有多少可用资源,一目了然。
- Scheduling:调度器信息入口。看队列、看用户资源配额的集中入口。
- Tools:配置文件查看入口。
首页大标题下面还会显示集群的总内存、总核数、已分配、未分配这几个大数字。
很多人进来第一眼只盯着那排大数字看,这其实是个误区。那几个数字是“快照”,反映的是当前时刻的全局资源量,但你排查具体问题的时候,更需要的是表格里那一条条记录。所以这篇文章我会把每个菜单单独拆出来,把每个字段、每个按钮、每个标签页都说明白,重点是让你看完能拿着这套界面去实际排查集群问题。
2. 核心页面逐块拆解:每个字段背后都藏着什么信息
2.1 Applications页面:任务的“户籍档案”
点开Applications,默认进入Running Applications页签,这里跑着所有还在执行的作业。这个表里的字段值得逐个看清楚,因为大多数任务问题都藏在这里。
- ID:应用的唯一标识,格式通常是
application_时间戳_编号。这个ID是排查问题的“主键”,你后面查日志、找后台任务、在ResourceManager里看诊断信息全靠它。 - User:提交任务的用户。看这个字段能快速判断是不是某个用户把队列资源占满了。
- Name:作业名称。这个名称不一定是你提交时指定的那个,框架内部可能给默认值,最好提交任务时显式指定一个有意义的名字,不然后面自己都看不出哪个是哪个。
- Queue:提交到哪个队列。配合Scheduling页面看,能判断是不是队列之间资源分配出了问题。
- Application Type:作业类型,常见的有MAPREDUCE、SPARK、TEZ等。如果你发现一个Spark任务用的是MapReduce的ApplicationMaster,可能是提交方式写错了。
- Start Time / Finish Time:起止时间。能算出任务跑了多久,但更关键的用处是排查“卡死”问题——如果一个任务跑了几小时还没结束,先把任务详情页打开看它最后的活动时间。
- FinalState:最终状态。只有任务结束才显示,一般有SUCCEEDED、FAILED、KILLED三种。特别注意区分FAILED和KILLED:FAILED是应用自身跑挂了,KILLED是外部有人杀掉了它。
- Progress:进度条。这个进度不是任务真正处理的数据百分比,而是Map/Reduce阶段完成的百分比,有一定参考性但不要全信。
- Diagnostics:最重要的一栏,但常常被忽略。任务失败后,红色诊断信息会直接写在这里。比如“Application application_xxx failed 2 times due to AM Container for appattempt_xxx exited with exitCode: 1”,这句话基本就把失败原因指出来了。
这里要说一个经验:很多人看任务失败,第一反应去NodeManager日志里捞线索,正确顺序其实应该先看Applications列表里的Diagnostics列,再看Application详情页的日志,最后才去NodeManager机器上翻日志。Diagnostics是ResourceManager从ApplicationMaster那边收集来的“官方口供”,往往比你自己乱翻日志高效得多。
2.2 Application详情页:单任务的全景体检报告
从Applications列表点进某个任务,就是一个单独的详情页。这个页面才是真正能深挖问题的地方,但它信息量大,不熟悉的人容易迷失。我建议按这个顺序看:
先看Overview区域,里面有关键的ApplicationMaster地址。那个链接点进去能看AM自己的Web UI(如果框架支持的话),对于Spark和Flink的任务尤其有用。AM的日志地址也在这一块,通常是一个https://节点名:端口号/node/containerlogs/容器ID/am形式的链接。
然后看Attempts区域,这是任务重试的记录。如果这里显示Attempt 1 FAILED,Attempt 2 RUNNING,那说明任务已经自己重试过一次。连续重试还失败,基本就是两种情况:要么代码有bug导致每次启动就崩,要么资源不够导致AM起不来。这两种情况的诊断信息完全不一样:前者一般是异常堆栈,后者通常是“queue is full”或者“exceeded the queue limit”之类的提示。
Containers区域非常容易被忽略,但我强烈建议每次都翻一下。它列出这个应用申请到的所有容器列表。如果某个Application的Container列表特别少,说明这个任务在资源申请阶段就一直“吃不饱”;如果Container列表五花八门分布在很多节点上,但进度就是不动,那大概率问题出在应用自身逻辑上而不是集群资源上。
2.3 Nodes页面:每一台工作节点的体检清单
Nodes页面就是YARN视角里的集群成员列表。这里要养成一个习惯:先看每台NodeManager的状态,再看资源使用情况。
页面里会区分节点状态:RUNNING、UNHEALTHY、DECOMMISSIONING、DECOMMISSIONED、LOST。这几种状态很多人分不清,我简单解释下:
- RUNNING:正常,节点在正常工作。
- UNHEALTHY:节点还活着,但健康监测失败。最常见的是本机磁盘写不进去了(磁盘满或权限不对),或者心跳超时。UI上UNHEALTHY节点通常会被调度器自动排除,新容器不再分配到这台机器。
- DECOMMISSIONING / DECOMMISSIONED:正在退役或已退役。一般是运维操作,把某台机器从集群里安全摘除。
- LOST:NodeManager失联了。如果机器还开着,大概率是网络问题或进程被杀。
重点说下UNHEALTHY,这个状态非常坑。我从实际踩坑经验看,很多“任务卡住不动”其实背后就是一两台节点的健康状态变红。正常情况下,任务在UNHEALTHY节点上跑的Container会被杀掉并重新调度,但如果是流式任务(比如Flink),杀Container可能导致整个Job重启。所以看到集群状态不对,先切到Nodes页面看一眼有没有节点变红。
Nodes列表里还有每个节点的资源量:CPU、内存、已用、剩余。这里要注意一个小陷阱:UI上显示的“Vcores Used”是虚拟核数,不是物理核数。如果你机器是48核的,但你配置了2倍超卖(vcore比例),节点上显示的虚拟核可能是96。看资源使用一定要结合你的实际配置来理解,不然会误判集群负载。
2.4 Scheduling页面:队列和资源的分配账本
Scheduling菜单进去后,默认能看到整个集群的调度快照。对于使用Capacity Scheduler的集群(这是绝大多数生产集群的默认选择),能看到并列展示的各个队列。
这里最关键的是队列里的资源使用情况统计,表格字段通常包括:
- Configured Capacity:队列配置的最大资源比例。
- Used Capacity:当前实际使用的资源比例。
- Max Capacity:弹性上限。如果配置了弹性,队列实际能用到的资源可能超过Configured Capacity。
- Used Resources:队列当前用了多少资源。
- Active Applications:队列里正在运行的任务数。
- Pending Applications:排队的任务数。
这四个字段组合起来能判读出非常多的信息:如果Configured Capacity很高但Used Capacity很低,说明这个队列资源闲置;如果Pending Applications一直不减,说明队列资源被“大头”任务占着,后面的作业在等配额;如果Max Capacity设了很高,你还能看到老大的任务占用超过自己配置份额时,把别的队列的资源也抢过来用了。
这里补充一个实战场景:假设你的生产环境有A、B两个队列,A队列里跑了一个超大任务,占满了集群资源,B队列任务全在排队。你去Scheduling页面一眼就能看到A队列Used Capacity是100%,B队列Resource Used那边几乎为零而Pending那边堆满了。这时候你就知道不是B队列配置有问题,是A队列的任务把资源“顶爆”了。如果这不符合业务预期,就得去调整A队列的Max Capacity限制,或者给B队列设更高的优先级。
2.5 Tools页面:隐藏的系统配置点
Tools菜单在界面里很容易被忽略,点开后能看到当前ResourceManager配置文件的具体参数。这个页面在排查问题的时候其实有大用处。
比如你发现任务提交不了,提示“Queue does not exist”。正常情况下这个提示会出现在Application的Diagnostics信息和客户端日志里,但如果你点了Tools页面,把yarn-site.xml和capacity-scheduler.xml翻出来看一眼,就能直接确认队列配置到底有没有写对。生产环境经常出现的情况是:业务方说“我们昨天新建了一个队列”,运维说“我加过了”,两边信息对不齐。打开Tools页面,当前运行中的调度器配置一目了然,谁也别争了。
3. 实操排查全流程:一个任务从提交到失败的UI追踪方法
3.1 提交一个作业后,UI界面会经历什么变化
以最常见的Spark On YARN任务为例,完整走一遍UI排查流程。
你提交任务后,大概10秒内刷新Applications页面,能看到新任务以RUNNING状态出现,但这时Progress大概率还是0。如果你看不到新任务,说明提交环节就出问题了——不是网络不通,就是资源不足导致AM根本没被启动。
再过一两分钟,任务如果正常开始执行,Progress会从0逐渐增加。如果进度一直停在一个数字不动,点进详情页看Containers列表,确认Executor容器是否都启动了。我见过很多次“任务一直Pending、Executors起不来”的情况,最后都是因为AM申请到的Container数量不够,或者是内存超出单容器限制被迫缩小并发,这些都是UI上能直接看到的迹象。
3.2 从UI判读任务失败的根本原因
一个经典场景:任务刚刚提交,几十秒后状态就变成FAILED。你打开Applications,翻到对应任务,Diagnostics显示类似这样的信息:
Application application_xxxxxxxxx_0001 failed 2 times due to AM Container for appattempt_xxxxxxxxx_0001_000001 exited with exitCode: -1000这种情况,UI已经告诉你AM的Container启动失败了。exitCode -1000通常意味着AM在启动的时候进程无法正常运行,十有八九是环境问题——比如Python环境路径不对,或者启动脚本里的某个依赖文件找不到。你去NodeManager的日志里会看到更详细的原因,但UI这边已经把排查方向定得死死的:不是资源不足,而是应用自身启动失败。
另一种场景:Tasks在列表里显示KILLED,但明明没人杀它。这种“自杀式”的KILLED,最常见的元凶是内存超限。UI里去看这个任务的Containers列表,找到对应节点上那个Container被Kill的日志,能看到“Container killed on request. Exit code is 143”或者“Memory usage exceeded limit”之类的信息。这就直接指向了Container内存溢出的问题,解决思路就很清晰了:要么调大spark.executor.memory,要么检查代码里有没有大量数据被缓存在堆内。
3.3 常用的三张UI截图排查法
在排查问题的时候,我习惯让团队成员拍三张截图:集群首页全局图、失败应用详情图、对应节点信息图。这三张图覆盖了“全局——任务——节点”三个维度,足以定位绝大多数问题。
比如说一个任务挂了,截图一能看到集群还剩余多少资源;截图二能看到失败诊断信息和重试次数;截图三能看失败容器落在了哪台机器、那台机器的资源状态。通常三张图信息拼一起,就能判断是“集群没有资源”“任务本身代码问题”还是“单点节点故障”。比口头描述“我的任务失败了”高效一百倍。
4. 高频问题与实用避坑指南
4.1 UI页面打不开或者打开很慢
正常访问8088端口,如果页面一直转圈或者直接超时,不要急着怪网络。先检查ResourceManager的进程是否还活着,然后确认YARN的WebAppProxy是否启用。很多集群做过HA,两个ResourceManager各自有Web UI,你访问备用RM的地址时页面大概率能看到,但很多API接口会一直等待。
另外一个隐蔽问题:如果你在浏览器里访问的是http://主机名:8088,而主机名解析到了内外网不通的地址,就会白屏超时。这时候直接换用节点的IP地址访问试试。YARN UI绑定地址默认是0.0.0.0,IP访问基本没问题。
4.2 页面显示的资源量和实际机器配置对不上
这种情况十有八九是没理解YARN资源管理模型。我在前面提过虚拟核数和物理核数的问题,再做一次强调:yarn.nodemanager.resource.cpu-vcores决定UI上显示的总核数,它不一定是物理机上的真实核数。很多公司为了利用率会配置超卖,比如物理48核、配置vcore 96,UI上显示总核数就是96。这时候你看到某个队列用了30核,心里要清楚真实的物理消耗大约是15核左右,不会出现CPU被打爆的误判。
内存也是类似逻辑:UI上显示的内存总量是NodeManager可分配的总内存,它排除了系统预留内存、心跳进程内存之外的部分。默认配置下推荐给容器用的内存往往是机器物理内存的一定比例,不是物理内存的100%。
4.3 任务反复重试但UI上诊断为空
这种情况最让人头大:页面显示FAILED,没诊断信息,点进详情页也不给具体原因。我的经验是直接去NodeManager所在机器上找日志,路径一般位于$YARN_LOG_DIR/userlogs/application_xxx/container_xxx/,里面有几个关键文件——stdout、stderr、syslog。遇到UI诊断信息不完整时,syslog里通常藏着真正的异常栈,能看到OutOfMemory还是文件系统错误。
顺带说一个技巧:stderr文件往往包含Container的退出原因,比如“Container exited with a non-zero exit code 1”。如果你在UI上看到“exitCode: 1”,直接去stderr里面找线索,大概率有异常堆栈。UI上不给你堆栈,是因为这些信息在NodeManager的本地日志里,不会通过网络传到ResourceManager这边。
4.4 队列显示有资源,但任务就是Pending
这是一个非常绕的问题。你打开Scheduling页面,看到队列的Used Capacity只有20%,剩余80%,但提交的任务状态一直是ACCEPTED然后卡在Pending。这个时候要看资源维度是否匹配。YARN调度时CPU和内存是分别计算的:队列剩余80%是内存维度,但CPU维度可能已经耗尽。UI上Scheduling快照里,每个队列的“Used Resources”会显示( X vcores, Y GB ),如果你看到内存还剩很多但vcore那栏的剩余已经为0了,就是CPU资源被占满。解决方法是调整队列的max vcore配置,或者让应用申请时减少vcore数量,避免因为CPU维度不足卡住调度。
4.5 节点显示RUNNING但分配不下去容器
有些节点状态是RUNNING,但该节点的Container数量一直为0,属于“能喘气但不干活”。这种问题多出现在健康检查细节上:NodeManager的yarn.nodemanager.vmem-check-enabled如果打开,而该节点的虚拟内存率超过了配置阈值,容器就会被杀掉或者根本就不再往那里分配。
遇到这种状态,去Nodes页面点击该节点的“Node Manager Logs”,拉到最近日志找“resoure”相关关键字,能看到类似“physical memory of recent attempt exceeded limit”的记录。这其实不是节点挂了,而是该节点物理机上的真实内存或虚拟内存超限。系统层面用free -g看内存、df -h看磁盘,基本能确认问题。
4.6 多个UI页面之间数据不一致
这里我要说一个很实用的经验:ResourceManager UI、NodeManager UI、JobHistory UI三者之间的数据是有时间差的,不要指望它们完全同步。
有时候任务已经FAILED,但ResourceManager首页的统计还把这个任务的资源算在“已分配”里,过一两分钟才释放。这可能是UI刷新延迟,也可能是AppMaster清理有一个过程。看到数字不一致不要慌:以Applications页面的状态为准说明任务状态,以Scheduling页面为准说明资源整体分配。其他页面数据只能作为辅助参考。
5. 实战观察:从UI指标中提炼调优信号
YARN集群UI不仅是排障工具,更是日常调优的风向标。我个人习惯是每周定期看几个核心指标,把集群的变化趋势放进自己的“心理模型”里。
第一个指标是首页的未分配资源。如果长期剩余资源很多,说明要么任务量不大,要么队列配置得过于保守,业务可以更激进地使用集群。如果剩余资源长期接近零但任务还能跑完,说明集群运转在一个比较饱和状态,这时候要关注任务对资源的争夺情况,尤其是大任务和小任务混跑的场景。
第二个指标是队列的Pending数量。如果某个队列的Pending稳步上涨,说明业务快速增长但队列配额跟不上。这时候不仅要在UI里调整弹性配置,更要考虑是否该启动资源预算机制,限制过量提交的任务。
第三个指标是节点健康状态。连续几天反复出现UNHEALTHY节点的集群,大概率存在硬件隐患或者磁盘配置问题。掉线的节点重新上线时,UI会体现为状态从LOST变回RUNNING,别轻易就免检放行,多留意几次就能找出规律。
图表的另一面是:UI永远只能给你现状,不能给你原因。memory usage很高是现状,原因可能是代码把一堆垃圾数据缓存了、也可能是数据倾斜导致单个Executor扛不住。这时候UI负责把你引到正确的日志文件前面,剩下的,该看堆栈看堆栈,该看项目代码看代码。
用YARN UI界面的这十年,我自己总结出一条经验:别把界面当成只能看数字的“Led显示器”,它是一个带有层级关系的信息入口——集群总览圈定大方向,任务列表锁定目标,任务详情页缩小范围,节点日志得出根因。这一条链路走下来,百分之七八十的问题都能在十分钟以内定位清楚。下次再接到“任务跑不动”的反馈,别一上来就翻日志,先花两分钟把UI整条链路走完,你会发现自己排查问题的效率直接翻倍。另外,平时多留意界面里的每个英文缩写,看UI至少能把YARN里那些容器、队列、节点的概念在真实环境里对上号,只有概念对上了,后面做的事才能真正落实到集群里。