Grafana+Prometheus实现Hadoop集群监控:从采集到Dashboard实战
简介本资源是一套开箱即用的Hadoop大数据生态监控仪表盘集合面向大数据运维工程师、平台开发人员及SRE岗位从业者解决Hadoop集群多组件HDFS/YARN/HBase/Kafka等缺乏统一可视化监控的痛点。压缩包共14个文件全部为Grafana可直接导入的JSON格式Dashboard配置文件涵盖总览、HDFSNameNode/DataNode、YARNResourceManager/NodeManager、HBaseHMaster/RegionServer、Kafka、EMQ、Solr及Prometheus基础面板等核心模块覆盖分布式存储、资源调度、实时消息与搜索服务等关键场景。资源包仅64KB轻量易部署。目前已有373人学习下载用户导入后无需从零构建只需对接已配置好的Prometheus或JMX数据源即可立即获得标准化指标视图、关键性能阈值预警逻辑及组件间依赖关系呈现显著降低监控体系搭建门槛与调试成本。 这几年做大数据平台运维大家应该都有一个同样的感受Hadoop生态组件越来越多从HDFS、YARN、HBase到Zookeeper、Kafka、Flink每个组件都有自己的Web UI和日志入口出了问题要在好几个页面之间来回切换定位一次故障往往比想象中耗时得多。Grafana搭配Prometheus做Hadoop大数据组件的Dashboard就是把这个分散的监控入口统一收口通过一个面板看清整个集群的健康度、资源利用率和任务运行状态。这篇文章我就从实际搭建过程出发把采集链路、指标设计、告警规则和排障技巧一次性讲清楚适合正在做Hadoop集群监控、想用Grafana替代或补充Ambari/CM监控页面的朋友参考。1. 整体设计为什么推荐用Grafana承载Hadoop监控做大数据组件监控最核心的诉求并不是“能画出曲线”而是“出问题时能快速定位到是哪个组件、哪个节点、哪类指标异常”。Grafana之所以在Hadoop监控场景里被大量使用是因为它本身不存储监控数据而是专注于数据可视化可以同时对接Prometheus、Loki、InfluxDB等多套数据源把机器层指标、业务组件指标、日志指标聚到同一个视图里。相较之下Hadoop发行版自带的Ambari或Cloudera Manager虽然有内置监控但存在几个明显的短板界面偏重、指标口径隐蔽、告警规则不好自定义、版本升级后图表经常失效。Grafana面板完全掌握在自己手里指标口径、展示维度、告警阈值都能按团队需求调整这个灵活度是发行版自带监控给不了的。1.1 监控链路从组件JVM到Dashboard的完整路径标准的Hadoop组件监控链路是“组件暴露指标 - 采集器抓取 - Prometheus存储 - Grafana展示”。Hadoop各组件NameNode、ResourceManager、DataNode、NodeManager等基于JMX提供了大量运行时指标比如JVM堆内存、GC次数、线程状态、RPC处理耗时、存储容量、文件操作计数等。我们通过jmx_exporter以HTTP端口暴露这些JMX指标然后由Prometheus按固定间隔拉取最后在Grafana里用PromQL查询并渲染成图表。Node节点的物理机指标CPU、内存、磁盘IO、网络带宽则通过node_exporter暴露Prometheus同样去抓取。这样设计的好处是不管是JVM进程指标还是宿主机指标都统一进Prometheus不需要额外维护两套采集和存储系统。实际生产环境中我通常给每台机器部署三个采集器node_exporter负责机器层指标jmx_exporter负责Hadoop Java进程指标再根据组件类型部署额外的Exporter如HBase的自带HBase表。采集器数量不多但监控维度已经覆盖了“机器活着不代表进程活着进程活着不代表服务可用”这两层判断。1.2 Dashboard的层级划分与布局思路一个真正好用的Hadoop大数据组件Dashboard不能把所有图表堆在一个页面里。我习惯把监控面板分成三层集群总览层、组件详情层、节点排查层。集群总览层是给值班同学看的只需要展示“集群是否正常、资源是否吃紧、任务是否堆积”这几类信息图表数量控制在8到10个保证扫一眼就能判断整体健康度。组件详情层则按HDFS、YARN、HBase、Zookeeper拆分每个组件独立一个Dashboard方便问题聚焦。节点排查层解决的是“某个节点异常上下游影响范围有多大”的问题用Grafana的变量联动功能通过下拉框切换主机名把单个节点的CPU、内存、磁盘、JVM堆、RPC延迟放到同一个页面。这套分层方式的优点在于职责清晰总览负责值班告警详情负责问题定位节点层负责深入排查。如果你只做一个大而全的Dashboard反而会因为信息过载而难以快速判断这是我踩过的一个实打实的坑。1.3 Prometheus与Grafana选型补充说明在监控存储选型上Prometheus是当前社区生态最完整的方案。它天然支持Kubernetes和虚拟机两种部署方式jmx_exporter、node_exporter这些采集器都是官方维护配置量小、社区资料多。对比传统ZabbixPrometheus在Hadoop这种“指标量大、标签维度多、查询方式灵活”的场景下明显更合适Zabbix更偏向IT基础设施监控对PromQL这种按标签聚合的查询模型支持欠佳。Grafana版本选择上如果你只需要基础监控图表Grafana 9.x或10.x都能用不需要追求最新版。但如果你要用到告警管理的分组、静默、路由功能建议至少用Grafana 10以上的版本告警规则的管理体验会好很多。2. 采集层搭建从Hadoop组件到Prometheus的关键一步很多朋友在搭建Hadoop监控时最先卡住的就是“指标从哪来”。Hadoop生态组件普遍通过JMX暴露指标但默认配置并没有开启远程访问所以我们需要用jmx_exporter以JavaAgent模式挂载到Hadoop进程上或者用HTTP模式单独启动一个进程抓取JMX数据。实际生产环境我更推荐JavaAgent模式配置简单不需要额外管理进程生命周期缺点是每个Java进程都要修改启动参数并重启服务。2.1 HDFS指标采集NameNode与DataNode配置示例NameNode是HDFS的“大脑”监控重点在JVM堆内存、GC、RPC延迟、文件操作计数、块状态这几个维度。以HDFS 3.x版本为例首先准备一个jmx_exporter的配置文件例如放在/opt/jmx_exporter/hdfs_jmx.ymllowercaseOutputName: true lowercaseOutputLabelNames: true whitelistObjectNames: - Hadoop:serviceNameNode,nameJvmMetrics - Hadoop:serviceNameNode,nameFSNamesystemState - Hadoop:serviceNameNode,nameRpcActivityForPort* - Hadoop:serviceNameNode,nameNameNodeInfo然后在NameNode的启动脚本hadoop-env.sh里增加JVM参数export HDFS_NAMENODE_OPTS$HDFS_NAMENODE_OPTS -javaagent:/opt/jmx_exporter/jmx_prometheus_javaagent-0.20.0.jar18080:/opt/jmx_exporter/hdfs_jmx.yml重启NameNode后访问http://namenode_host:18080/metrics就能看到Prometheus格式的指标输出。DataNode的配置思路完全一样只是把JMX ObjectName换成DataNode相关的MBean例如Hadoop:serviceDataNode,nameDataNodeActivity采集端口换成另一个比如18081。注意这里有个小细节NameNode和DataNode的启动参数要写对路径尤其是多目录部署时建议采用独立配置文件的方式不要在启动参数里写一大串JVM参数否则后续维护会很难受。2.2 YARN指标采集ResourceManager与NodeManagerYARN的ResourceManager承担集群资源调度需要监控的指标包括可用内存/核数、已分配资源、队列中的APP数量、Container运行状态等。同样用jmx_exporter方案我通常给ResourceManager配置以下MBeanwhitelistObjectNames: - Hadoop:serviceResourceManager,nameJvmMetrics - Hadoop:serviceResourceManager,nameClusterMetrics - Hadoop:serviceResourceManager,nameQueueMetrics,q0*这里有一点容易踩坑YARN的队列指标带有标签维度(q0队列名)如果队列很多jmx_exporter会产生大量时间序列对Prometheus的存储压力会明显上升。建议在配置阶段先梳理队列数量如果超过50个要么只采集核心队列要么在Prometheus端用metric_relabel_configs只保留需要的队列标签避免指标基数膨胀。NodeManager指标采集可以参考DataNode的方式重点监控运行中的Container数量、本地磁盘使用、JVM GC。NodeManager节点多采集端口要统一规划建议按组件类型分配端口段比如NameNode用18080、DataNode用18181、ResourceManager用18282、NodeManager用18383避免在Grafana里看到一堆标签分不清是哪台机器。2.3 HBase与Zookeeper超出HDFS/YARN后的延伸监控如果你的集群里还运行着HBase那么HBase Master和RegionServer的指标也需要纳入监控。HBase自身提供了/jmx端点也可以用jmx_exporter统一采集重点指标包括RegionServer的MemStore大小、BlockCache命中率、Region数量、写请求延迟等。Zookeeper则用zookeeper_exporter采集重点关注znode数量、连接数、延迟和leader选举状态这些指标对判断HDFS和HBase的元数据操作是否正常很有帮助。注意Kafka、Flink这类组件也有对应的Exporter方案但我建议先把HDFS、YARN、HBase、Zookeeper、机器层这五类基础监控做好再逐步扩展。监控体系的搭建应该循序渐进一次铺太多Exporter反而会给后续排障增加噪音。2.4 机器层指标补充node_exporter部署无论Hadoop组件优化得多好底层物理机的CPU、内存、磁盘、网络一旦出问题上层服务必然受影响。node_exporter的部署相对简单每台机器一个进程即可默认端口9100。需要特别关注的是磁盘指标因为HDFS的DataNode经常需要挂载多块磁盘node_exporter默认会采集所有挂载点的空间和inode用量。部署时注意做一下磁盘挂载点的过滤只保留数据盘挂载点避免/boot、/tmp这些系统分区干扰告警判断./node_exporter --collector.filesystem.mount-points-exclude^/(boot|sys|proc|dev|run|var/lib/docker)/.*3. Dashboard核心面板设计与指标解析采集链路搭好之后真正考验功力的地方是“面板怎么设计”。一个合格的Hadoop大数据组件Dashboard应该让读者在10秒内回答出三个问题HDFS还有多少容量YARN能不能提交新任务有没有节点处于异常状态我按照这个思路把整个Dashboard拆成四个大块下面逐一说明。3.1 HDFS面板容量、块状态与操作延迟HDFS总览页我至少会放以下图表HDFS容量使用率已用容量/总容量用饼图或Gauge展示这个指标直接反映集群容量水位超过85%就要提前规划扩容或清理数据。存活DataNode数量用Statistic类型展示配合“存活节点/总节点”的阈值判断一旦数字低于某个值就要马上检查。Under Replicated Blocks副本不足的块数和Missing Blocks丢失块数用时间序列曲线正常情况下应该趋于0如果持续有波动说明有节点在退服或副本修复进度过慢。NameNode RPC处理延迟按百分位展示例如P99延迟突然升高通常意味着NameNode负载过高或GC停顿。在设计HDFS容量告警时要注意HDFS的“容量水位”并不能只看NameNode报告的已用容量因为HDFS写满后是“硬不可写”不会像普通文件系统那样只是性能下降。因此我把HDFS容量阈值设为80%预警、90%紧急并在Dashboard上加了一个“各目录空间Top10”的列表通过命令hdfs dfs -du -h /path的周期性采集结果生成方便快速定位哪些目录是大容量消耗源。HDFS块状态这块建议在PromQL中把各状态聚合起来。比如sum(hadoop_namenode_fsnamesystem_underreplicatedblocks) sum(hadoop_namenode_fsnamesystem_missingblocks) sum(hadoop_namenode_fsnamesystem_pendingreplicationblocks)这三个值放在同一张图里观察能清楚看到副本修复的“水位下降”过程。如果pending值一直很高而underreplicated不降大概率是网络带宽瓶颈或DataNode磁盘IO卡住了需要去节点层排查。3.2 YARN面板资源水位与任务堆积YARN面板的核心就是回答“还能不能跑任务”。我常用的指标包括集群可用内存/核数用时间序列或面积图直观展示资源水位。运行中APP数量、等待中APP数量等待数量持续升高说明资源不足或队列配置不合理。队列维度资源使用率通过YARN的QueueMetrics指标按q0标签聚合能清楚看到每个队列的“吃水线”。Container失败率这个指标容易被忽略如果某个时间段Container频繁失败可能是代码问题也可能是NodeManager所在的机器资源争抢严重。队列维度的展示建议做成Grafana的变量这样不需要修改图表通过下拉框切换队列名称。变量值用PromQL自动填充label_values(hadoop_resourcemanager_queuemetrics_allocatedresources_vcores, q0)这个技巧能大大提升Dashboard的复用性你只需要维护一套队列变量所有队列图表都会自动联动。这里还有个小技巧YARN有两种资源维度内存和vCore。我在面板里默认展示内存使用率因为内存通常是提交任务的硬性门槛vCore只是在CPU密集场景下才会成为瓶颈。如果你所在团队的作业大多是Spark/Flink任务建议同时展示“容器CPU使用率”因为Spark和Flink对CPU的消耗非常明显只看内存容易误判集群资源“还有余量”。3.3 HBase与Zookeeper面板延迟与可用性HBase面板我重点关注RegionServer的BlockCache命中率、MemStore大小、读/写延迟P99。BlockCache命中率低于90%时查询性能会有明显下降通常是Region数量过多或表设计有问题。MemStore大小如果不断上涨说明写入速度高于刷新到HDFS的速度需要关注HBase的flush线程和RegionServer堆大小。Zookeeper面板则相对简单最核心的是“连接数”“znode数量”“Leader是否选举成功”这三类指标。其中连接数突然上涨常常是客户端连接泄漏我会单独做一个“按IP连接数Top10”的列表帮助快速定位是哪个业务方在疯狂建连。Zookeeper的延迟指标用zookeeper_server_latency_avg即可如果P99延迟超过100ms对HDFS NameNode的元数据操作会产生微妙的影响要认真排查。3.4 PromQL查询与变量设计避免“图表很多信息重复”设计面板时最大的误区是“图表数量越多越好”。我见过不少Dashboard把同一个指标用不同颜色、不同图表类型重复展示占满整个屏幕但信息密度极低。我的建议是每个图表只回答一个明确问题。比如“HDFS容量是否够用”和“HDFS最近1小时写入量”是不同问题一个用Gauge一个用趋势图放在同一格子里没问题。但“HDFS已用容量”和“HDFS容量使用率”本质上是同一个信息保留一个即可。PromQL里常用的聚合算子包括sum、avg、max、histogram_quantile在Hadoop监控中要结合场景选择。比如RPC延迟这类极差很大的指标用histogram_quantile(0.99, sum(rate(hadoop_namenode_rpc_processingtime_seconds_count[5m])) by (le))能反映长尾而“存活DataNode数”直接count(hadoop_datanode_metrics_*_lastuploadedblock)即可。Grafana的变量功能不只在队列维度用节点维度、集群维度都可以做成变量避免在图表里硬编码主机名。4. 告警规则与联动优化从“看图表”到“自动发现”Dashboard做得再好也不可能24小时有人盯着屏幕。真正让监控体系产生价值的是告警规则。Grafana从8.0版本开始内置了告警引擎可以直接在面板上创建告警规则也可以通过Prometheus的Alertmanager统一管理。我个人的习惯是把“简单阈值类告警”放在Grafana侧把“涉及多个指标组合判断、需要路由分发的复杂告警”交给Alertmanager这样职责清晰、维护成本低。4.1 典型告警场景与表达式以下是我在生产环境验证过比较靠谱的几条Hadoop监控告警规则告警名称表达式阈值/持续时长说明NameNode进程存活up{jobhdfs-namenode} 0持续1分钟进程级探活比JVM指标更直接HDFS容量预警(hadoop_namenode_capacity_used / hadoop_namenode_capacity_total) * 100 85持续15分钟容量超过85%发预警DataNode下线检测count(hadoop_datanode_metrics_*_cachecapacity) 预期数量持续3分钟通过节点数判断是否有节点掉线UnderReplicated块异常sum(hadoop_namenode_fsnamesystem_underreplicatedblocks) 1000持续10分钟超过1000个块副本不足时需要关注YARN等待任务堆积sum(hadoop_resourcemanager_clustermetrics_apps_pending) 50持续5分钟等待任务高说明资源不足或调度卡住YARN可用内存不足hadoop_resourcemanager_clustermetrics_availablememoryMB 10240持续5分钟可用内存小于10G新任务大概率提交失败RegionServer延迟高histogram_quantile(0.99, sum(rate(hbase_regionserver_put_seconds_count[5m])) by (le)) 1持续10分钟写延迟P99超过1秒这里有一条很关键的实战建议告警表达式里尽量不要直接用“绝对值”判断节点数量。比如“DataNode下线检测”如果写死count 3一旦集群扩容到10个节点告警就失效了。正确做法是先用count计算出当前节点数再和过去1小时的平均值做对比超过标准差范围才告警。用PromQL实现大概是count(hadoop_datanode_metrics_*_cachecapacity) (avg_over_time(count(hadoop_datanode_metrics_*_cachecapacity)[1h:5m]) * 0.8)这样即使节点数动态变化告警阈值也能自动适配不会因为集群扩容而产生误报。4.2 告警渠道配置钉钉、邮件与WebhookGrafana告警规则的渠道配置有两条路一条是直接用Grafana的Notification Policy另一条是通过Alertmanager转到外部系统。我目前用的是Grafana内置告警通过Webhook把消息推到钉钉群机器人和企业微信。配置时要注意告警内容模板里尽量带上“集群名”、“组件名”、“当前值”、“持续时间”、“链接到Dashboard”这几项方便值班同学一眼看懂。比如钉钉告警的消息模板我会写成类似【Hadoop集群告警】 告警级别: {{ .Labels.severity }} 告警名称: {{ .Labels.alertname }} 集群: {{ .Labels.cluster }} 当前值: {{ .ValueString }} 持续时间: {{ .StartsAt }} 面板链接: {{ .ExternalURL }}这个模板虽然简单但在真实值班场景下能减少大量无效沟通。因为告警消息里的信息越完整值班同学越不需要去翻Grafana页面来确认到底是什么问题。4.3 与现有运维系统的联动告警只是第一步真正省心的是把告警和工单、自愈脚本联动起来。我在实践中会把Grafana告警发到企业微信的机器人后再通过一个简单的Python服务接收Webhook触发以下动作一是自动执行hdfs dfsadmin -report采集当前HDFS状态快照二是把告警写入工单系统三是当告警恢复时自动在群里发送恢复消息。这套联动机制做得不算复杂但有效降低了“告警疲劳”。告警疲劳的本质是“每条告警都需要人工确认”而联动机制把大部分确认动作变成自动化人只需要关注真正需要决策的事件。5. 实战经验与常见问题排查实录监控体系搭建完成后真正的考验在于日常使用中出现的各种“看似正常但图表不对”的情况。我把自己踩过的一些坑和排查经验整理出来希望对大家有帮助。5.1 指标采集不上来先从这几个方向排查最常遇到的场景是“Prometheus配置好了但Grafana面板里全是NODATA”。排查顺序我建议这样走第一确认jmx_exporter的metrics端点是否能访问。直接在浏览器或curl访问http://组件IP:采集端口/metrics如果返回406说明jmx_exporter配置里没有匹配到任何MBean需要检查yml文件的whitelistObjectNames。如果页面空白可能是端口没监听或被防火墙挡住了。第二确认Prometheus的targets状态。在Prometheus UI的Status - Targets页面如果某个target显示DOWN多半是网络不通或exporter进程挂了如果显示UP但采集的指标数量是0那就要回到第一步。第三确认指标名称拼写。jmx_exporter默认会把MBean名里的点.转成下划线_变量名也会转小写。比如JvmMetrics里的HeapMemoryUsed在jmx_exporter 0.20.0版本下会变成hadoop_namenode_jvmetrics_heapsizeused之类的格式。如果PromQL写错一个字母面板必然白屏。这里我给一个比较实用的方法{__name__~hadoop_namenode.*}在Grafana的Explore页面直接查一下这个PromQL能看到所有以hadoop_namenode开头的指标名用它来反向确认实际指标名称比自己猜准确得多。5.2 Dashboard导入官方库模板与自定义取舍Grafana官方Dashboard库grafana.com/dashboards里有一批Hadoop/HDFS/YARN相关的模板搜索关键字“hadoop”“hdfs”“yarn”就能找到。直接导入官方模板确实方便但要注意几个问题一是模板作者所用的Exporter版本、指标命名可能和你当前环境不一致导入后经常出现空曲线二是官方模板普遍只覆盖HDFS和YARNHBase、Zookeeper、机器层需要自己补三是模板里的告警规则阈值不一定匹配你的业务体量。我的建议是官方模板只作为“指标设计参考”不要直接拿到生产用。先看它用了哪些PromQL、哪些变量然后按自己的指标命名整理一套Dashboard JSON。这套自建面板虽然前期搭建花时间但后续维护和扩展会顺畅很多。如果你不想从零开始也可以先把官方模板导入测试环境逐个图表验证指标是否命中命中率高的保留不命中的替换成自己环境的PromQL。5.3 性能优化指标基数控制与大屏渲染Hadoop集群动辄几十上百个节点如果采集器配置不当Prometheus的内存和磁盘压力会非常大。常见的指标基数爆炸场景有两个一是jmx_exporter采集了每个DataNode的线程栈信息或JMX ObjectName中的独有标签导致时间序列数量成倍增长二是不小心把HBase Region级别的指标全量采集Region数千个每个Region都产生指标Prometheus压力会瞬间拉满。解决思路是“尽量在采集端过滤”不要在Prometheus端再丢弃。jmx_exporter的yml配置文件可以通过whitelistObjectNames和blacklistObjectNames精确控制要采集的MBean。不要图省事采集全部否则存储和查询速度都会受影响。在Grafana侧Dashboard的渲染性能也需要关注如果图表数量超过30个建议开启min interval配置减少每个查询的时间分辨率还可以开启Dashboard的refresh设置为30s或1m不需要每5秒刷新一次否则在告警时大家一起刷新页面Grafana很容易卡死。5.4 一个容易忽略的坑jmx_exporter的端口占用与版本兼容jmx_exporter的JavaAgent模式随Java进程启动如果同一个机器上有多个Hadoop进程比如NameNode和ResourceManager跑在同一台机器就要特别注意端口冲突。我见过有同事把每个进程的jmx_exporter端口都配成18080结果只有第一个进程能启动成功其他进程直接报“Address already in use”。所以在规划采集端口时要确保每台机器上的多个Hadoop进程端口各不相同。另外jmx_exporter的版本和Hadoop JDK版本也有兼容性问题。Hadoop 3.x默认要求JDK8jmx_exporter 0.20.0版本在JDK8上运行正常但如果你升级到JDK11或JDK17建议同步升级jmx_exporter到0.20.0以上版本否则可能出现“java.lang.IllegalAccessError”这类奇怪报错。升级Exporter后记得要重启Hadoop进程才能生效这一点在做版本升级窗口时要提前规划。5.5 告警恢复通知怎么处理才能避免“狼来了”设置告警之后恢复通知很容易被忽略。如果只设置“触发告警”不设置“恢复通知”值班同学可能不知道某个问题已经自动恢复了还要在群里追问。反之如果恢复通知过于频繁比如某指标在阈值附近抖动群里一会儿告警一会儿恢复人很快就会麻木。我建议通过两个手段解决一是告警规则里加上for持续时间让异常状态至少保持5分钟才触发二是在Notification Policy里将恢复通知合并成每15分钟发送一次忽略中间多次状态翻转。Prometheus的Alertmanager里可以用group_wait和group_interval控制聚合Grafana告警则在Alert rule的“Evaluate every”和“For”里控制。这些配置虽然看起来是细节但在实际运维中直接影响告警的可靠性和团队的响应意愿。一个经常误报的监控系统最终的结果就是没人看。所以在搭建Dashboard时宁可少加几条告警也要保证每一条告警都有明确的业务含义值得人力介入。再分享一个我最近在用的技巧把Grafana Dashboard嵌入到团队的内部数据大屏通过iframe嵌入的方式做统一展示。机房里的值班大屏上同时展示Hadoop集群容量、YARN任务趋势、HBase读写延迟这三组核心图表运维同学一眼就能判断整个平台的运行状态。Grafana的匿名访问权限只开放给内网大屏专用账号避免把Dashboard随意暴露到外网。这个做法在团队内部反馈很好算是把监控价值放大到了整个业务侧。本文还有配套的精品资源点击获取