十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

数据湖监控运维实战:分层监控与告警体系构建

数据湖监控运维实战:分层监控与告警体系构建 从数据湖这个概念火起来到现在大部分团队聊的还是怎么建湖、选哪种表格式、怎么和数仓分层配合。但真正把湖建起来之后那才是麻烦的开始。数据湖的监控运维和传统数仓完全是两套逻辑存储与计算分离、元数据与数据分离、开放式表格式带来的新故障形态任何一个环节没盯住轻则任务延迟重则数据写不进去、查不出来而且问题往往藏得很深不像数仓那样看一眼任务日志就能定位。这篇东西不聊怎么搭数据湖只讲建完之后怎么把它盯住。1. 数据湖运维到底在“湖”的哪个位置先把监控对象分层很多人上手做数据湖监控第一反应是看CPU、内存、磁盘把服务器盯得死死的结果集群资源一切正常业务方却天天投诉数据出不来。问题出在没搞清楚数据湖的监控对象和传统大数据平台不一样。数据湖的技术栈天然是多层解耦的监控也必须跟着这个结构分层每一层的故障特征、影响范围、响应手段都不一样。1.1 基础设施层最熟悉但最不该花太多精力这一层就是物理机或者云主机上的CPU、内存、磁盘、网络、IO。基础设施层出问题往往是全局性的比如某台节点磁盘写满、网卡软中断飙升、内存 swap 严重。这些指标通过常规的 node_exporter 加 Prometheus 就能覆盖告警规则也成熟磁盘使用率超 80% 提醒、超 90% 报警CPU 持续 95% 以上持续 15 分钟触发。这一层我不建议搞太复杂的策略阈值拍得合理、告警能发出来就够了。原因是数据湖架构本身对基础设施故障是有一定冗余设计的比如 HDFS 多副本、对象存储的 11 个 9 持久性。基础设施抖动通常不会立刻毁掉数据但如果都靠冗余硬扛迟早会出事。我见过最典型的案例是某团队磁盘使用率到了 85%觉得还扛得住结果三天后一个凌晨大面积写失败一查是 NameNode 的 edit log 所在磁盘满了整个集群只读。所以基础设施层的核心监控目标不是性能而是容量水位尤其是元数据节点、日志目录、临时目录这种不起眼但致命的位置。1.2 存储层与元数据层数据湖的任督二脉再往上走是存储服务和元数据服务。如果你用 HDFS 做存储底座要盯 NameNode 的 RPC 延迟、Active/Standby 状态、块报告堆积、GC 耗时如果用对象存储要盯请求量、限流错误码比如 503、429、桶级别的容量增长。存储层的问题往往有一个明显的前兆期比如 RPC 延迟从 5ms 涨到 80ms不会一下崩掉但已经说明 NameNode 压力大了。这时候不干预后面就是雪崩。元数据层则比存储层更隐蔽也更贴近数据湖特有架构Hive Metastore 或者各家自研元数据服务是核心中的核心。数据湖的表格式Hudi、Iceberg、Delta Lake都有独立的元数据目录每次提交 commit 都会更新元数据这些操作全部压在一个或几个服务上。元数据服务的 CPU、堆内存、线程池活跃数、锁等待时长、慢查询数这些指标必须进入监控清单。我踩过一个特别典型的坑某次我们一张大表的写入任务频繁执行 DDL导致 HMS 后端数据库的连接池被打满HMS 出现大面积超时。从监控上看HMS 所在节点的 CPU 只有 40%内存也正常但业务已经全堵了。后来加了线程池活跃数和锁等待指标才看出门道。所以数据湖的元数据监控不能只看资源必须深入到服务内部状态指标。1.3 计算引擎层与数据资产层从服务活着到数据是对的计算引擎层包括跑在数据湖上的 Spark、Flink、Presto/Trino 作业。这一层的监控大家比较熟Spark 的 Executor GC、Shuffle 溢出、任务失败率Flink 的 Checkpoint 时长、Backpressure、反压线程数都是常规操作。真正容易被忽视、也是我认为数据湖运维和传统数仓最大区别的是数据资产层的监控。所谓数据资产层是指以表-分区-文件为粒度的监控维度。传统数仓你盯着任务跑完就算完事但数据湖里任务跑完不代表数据是对的。文件写完有没有提交成功提交的元数据是否一致分区下有没有产生大量小文件快照是否膨胀历史版本有没有被意外清理这些全部是数据湖特有的监控对象也是后续所有数据质量问题的根源。小结一下我建议的监控分层层级核心监控对象典型告警场景基础设施层CPU、内存、磁盘、网络磁盘水位过高、内存压力大存储层HDFS NameNode / 对象存储限流RPC延迟升高、请求被限流元数据层HMS / 自研元数据服务连接池打满、锁等待、慢查询计算引擎层Spark / Flink / TrinoCheckpoint失败、反压持续数据资产层表文件分布、分区产出、快照小文件爆炸、分区产出延迟这一套分层思路的核心价值在于每一层出了问题你都能快速判断影响范围。基础设施抖动是广度问题元数据层故障是全局写入或读取中断数据资产层问题则是慢性病不会马上崩但会日益恶化。监控体系只有覆盖到这五个层次才称得上完整。2. 数据湖监控指标怎么定存量、流量、质量三类一个都不能少接到过很多同行的问题数据湖监控到底看哪些指标网上搜到的都是大而全的指标列表几百个指标堆在 Grafana 上出事了还是两眼一抹黑。我的经验是不要从有什么指标可采出发要从我每天需要回答哪几个问题出发。我把数据湖的监控指标归纳成三类分别回答三个问题数据长什么样了数据流得顺不顺数据对不对2.1 存量类指标盯住湖里的资产状况存量类指标描述的是数据湖当前的状态快照这类指标不需要实时采集一天扫一两次就够了但必须有。第一个必看的是表/分区维度的文件数、平均文件大小、小于阈值文件占比。这是判断数据湖健康度最直观的指标。比如一张日分区表分区下应该有 200 个 256MB 的文件结果某天开始变成了 2 万个 2MB 的小文件那基本可以断定写入作业的并行度过高或者 commit 频率太频繁。文件数不仅影响查询性能对 HDFS NameNode 内存也是直接压力。第二个是快照数量和快照总大小。Hudi 的每次 commit 都会生成一个新的快照Iceberg 每次写入也产生新的 snapshot如果快照保留策略配置不当历史快照会疯狂累积。我见过一个极端案例某张表的快照数量超过 3000 个表目录下 metadata 文件占了几个 GB查询时 Iceberg 要加载的 manifest 列表巨长P95 查询延迟从 2 秒飙到 40 秒。所以快照数、快照总大小、最老快照的时间这三个指标必须监控它们直接反映表的元数据债务。第三个是存储总量与日环比增速。这个指标看起来简单但它是成本治理的第一道防线。存储增长突然翻倍要么是业务量涨了要么是出了 bug 在重复写数据。我遇到过某团队一个重跑任务没开 overwrite 模式把同一份数据追加了 30 遍如果不是存储环比监控发现异常这个问题可能要等月底账单出来才能暴露。2.2 流量类指标盯住数据管道是否通畅流量类指标回答的是数据从产生到能查到底花了多久这比任何引擎层面的指标都更能反映问题。最核心的是端到端数据延迟。一条记录从业务系统产生经过 Kafka、Flink 写入数据湖到最终可以被查询这个时间差才是业务真正关心的 SLA。实现上可以用 watermark 机制在 Flink 作业里埋点或者更简单地在数据里带上业务时间字段再定期扫描表的最大事件时间和当前时间做差值。比如实时入湖的表端到端延迟目标 10 分钟一旦超过 30 分钟就要告警。然后是Commit/Checkpoint 相关指标。数据湖表格式的每次写入都是以 commit 完成的Hudi 有 commit duration、Delta Lake 有 commit 耗时、Iceberg 有 commit 失败率。commit 耗时变长通常是元数据服务变慢或者并发提交冲突变多。Flink 写 Hudi 时还会遇到一个经典问题checkpoint 成功了但 commit 失败数据实际没进湖。所以单看 Flink checkpoint 成功与否还不够必须同时看 Hudi 的 commit 成功率。最后是小文件生成速率和 Compaction 积压量。Hudi 的 MOR 表配置了异步 compaction 的话会产生 pending 的 compaction 计划如果生成速度大于消费速度积压会越来越多读时合并的查询延迟会逐步恶化。这个指标非常隐蔽但杀伤力极强需要单独监控。2.3 质量类指标数据湖不是写进去就行数据质量监控在数据湖场景下比传统数仓更复杂因为数据湖写入路径多样可能是批任务、实时流、甚至是 ad-hoc 的 SQL 插入。如果只盯任务状态等业务方反馈数据不对可能已经过了好几天了。我建议至少配置三个维度的质量监控完整性。主键唯一性、最新分区行数波动、全表行数趋势。行数波动是最容易被忽略的比如某次代码变更导致过滤条件写错一个分区只写入了正常数据的 10% 行数。如果没有行数波动监控这种问题要等到下游报表对不上账才发现。行数波动的告警阈值我一般用环比最近 7 天均值的正负 20% 作为边界超过就告警。准确性。NotNull 率、字段枚举值分布漂移、最大值最小值是否在合理区间。这类指标可以做成定期的质量巡检任务每天凌晨跑一遍质量规则引擎把异常结果写入监控库。及时性。每个分区是否按预期时间产出。数据湖经常有上游任务依赖链路一层推一层某一层卡住了下游全是连环迟到。分区分产出时间监控比如日分区表规定每天早上 8 点前必须产出超时就告警这样能做到问题逐层定位。2.4 阈值怎么定别照抄别人的告警规则指标定义完之后阈值设计才是真正考验经验的地方。我不建议直接抄网上别人的告警规则每个团队的数据量、表数量、业务特点完全不同。我通常的做法是先观察两周把指标的基线和波动范围记录下来再定阈值。比如小文件占比如果你的表平均文件大小本来就只有 20MB那就不能等其他表 256MB 的标准。阈值定得太松告警失去意义定得太紧运维人员天天被噪音轰炸最后看到告警也麻木了。一个实用的原则告警要分级不能一视同仁地钉人。P0 级别是数据完全不写、元数据服务不可用、存储写失败这类必须连续告警直到有人确认P1 是延迟超阈值的 2 倍、任务连续失败 3 次、磁盘水位超 85%P2 是小文件数量增长趋势、存储成本异常、查询延迟缓慢恶化。P2 级别的告警每天汇总一次发到运维群里就够了没必要半夜把人叫起来。3. 从一次元数据服务抖动说起完整的数据湖监控排查链路光列指标没意思我拿一个真实的排查案例复盘一下完整链路。这个案例发生在某个数据湖集群上当时有一个现象写入任务越来越慢但没有任何一个任务报错。3.1 故障现象某天上午 10 点开始数据湖上的实时写入作业出现明显延迟Flink 作业的 Checkpoint 时长从正常的 30 秒涨到了 2 分钟部分作业开始出现 Checkpoint 超时。同时数仓同学反馈一些最新分区的数据查询不到。从 Grafana 上看HDFS 的容量和节点状态都正常Spark 任务也没有失败整个系统看起来没坏但业务就是不通。3.2 排查链路从表现逐层下钻我当时的排查路径是这样的。先看告警大屏的整体健康度确认影响范围。发现只有实时写入作业受影响批处理任务正常。这说明问题大概率不在底层存储而在实时链路共用的某个组件上。再看HMS 的服务状态。因为 Flink 写 Hudi 和 Hive Metastore 交互非常频繁每次提交都要更新元数据。一查 HMS 的监控面板发现活跃线程数从平时的 30 涨到了 180线程池已经接近上限大量请求在排队等待。然后看 HMS 的慢查询日志发现大量针对同一张表的 ALTER TABLE 操作。这张表是实时入湖的事实表上游数据源临时加了一个字段Flink 作业收到 schema 变更后自动执行了 ALTER TABLE。但问题在于同一时间有好几个作业都在执行相同的 ALTER互相阻塞产生了大量的锁等待。接下来看数据库连接池。HMS 后端元数据库是 MySQL慢查询日志显示连接池活跃连接已经打满大量请求在拿不到连接后超时重试超时又进一步加重了连接池的负担形成恶性循环。3.3 根因与修复根因就是元数据服务成为瓶颈点引发全局写入阻塞。数据湖的元数据服务是典型的单一故障域它的处理能力决定了整个湖的写入上限。修复动作分了三步先临时干预杀掉多余的 ALTER TABLE 任务释放 HMS 的锁和连接资源。这个动作很暴力但能快速止血让写入链路先恢复。调整 HMS 的配置参数。关键是metastore.server.max.threads从默认值调大同时把后端数据库连接池的上限抬高。这里要注意单纯调大线程数不一定有效如果数据库连接池跟不上只是把压力往后端转移。所以两个参数必须同步调整。修改 Flink 作业的 schema 变更处理策略。不允许多个作业并发执行 DDL同一张表的 schema 变更必须串行化。3.4 复盘哪些监控应该提前补上事后我复盘这个故障其实有很明显的前兆只是当时没有对应的监控。首先是HMS 线程池活跃数如果提前监控了这个指标会在 10 点之前就看到线程数开始爬坡而不是等到 10 点半才通过业务反馈发现。其次是HMS 锁等待时长如果这个指标有告警在锁竞争刚开始加剧时就能收到通知完全来得及在影响扩大前处理。最后是DDL 请求量特别是同一张表的 DDL 频率这种指标异常通常预示着代码变更或者任务配置变更。这个案例值得每一个做数据湖运维的人重视数据湖的故障往往不是崩出来的而是积出来的。监控体系的价值就是把这些积累的过程变成可见的曲线在临界点之前提前干预。4. 存储与文件布局的“慢性病”小文件和快照膨胀怎么盯、怎么治如果说元数据服务抖动是急症那存储和文件布局的问题就是慢性病。急症发作时很吓人但慢性病长期不治成本会一点一点吞噬掉整个集群的性能和钱包。以下两个问题是数据湖运维中最常见的存储层慢性病。4.1 小文件问题数据湖的细胞癌变小文件的产生几乎是数据湖的原罪特别是流式写入场景。Flink 默认的 checkpoint 间隔如果是 1 分钟那么每个 partition 每分钟就会产生一个文件一天下来就是 1440 个文件。如果这张表设置的是小时级分区那每个小时分区下就是 60 个小文件听起来还好但注意这不是一个并行度如果 Flink 作业并行度是 20那每个小时分区就是 1200 个文件。一个月下来单表文件数轻松破百万。小文件的危害是渐进式的。首先HDFS 的 NameNode 把所有文件元数据都存在内存里一个文件大概占用 150 字节内存1000 万个文件就是 1.5GBNameNode 内存吃紧RPC 响应变慢。其次查询引擎扫描数据时要打开大量小文件列式存储的压缩优势也发挥不出来一个 2MB 的 parquet 文件压缩比远不如 256MB 的文件。更麻烦的是Hudi/Iceberg 每次查询要加载文件列表小文件越多元数据解析时间就越长查询性能迅速恶化。监控小文件的实操方法我建议每天凌晨跑一个 Spark 任务扫描所有表的文件分布统计每张表的总文件数、平均文件大小、小于 64MB 文件的数量和占比以及文件数周环比趋势。把这些指标写入监控结果表Grafana 里展示表格式或分区维度都可以看。告警规则用趋势型而不是绝对值型如果某张表的文件数以周为单位增长超过 30%就触发 P2 告警。治理手段是大家熟知的 compaction 类操作。Hudi 叫 clusteringDelta Lake 叫 optimizeIceberg 叫 rewrite_data_files本质都是把小文件重写成大文件。我重点强调一下执行策略第一 compaction 要错峰执行避开写入高峰否则会抢资源还可能导致并发提交冲突第二控制并行度一次性对全表做 compaction 可能出现 commit 冲突要按分区逐个处理第三重写后的文件大小目标设在 256MB 到 512MB 之间不要贪大超过 1GB 的文件在查询时反而因为列存 block 太大影响谓词下推效果。4.2 快照膨胀与孤儿文件看不见的元数据债务快照是数据湖实现时间旅行和 ACID 的核心机制Hudi 每次 commit 生成一个快照Iceberg 每次写入生成一个 snapshot。但如果快照清理策略没配好这玩意儿就成了运维的噩梦。快照膨胀的监控指标包括快照数量、快照总大小、最老快照时间。注意这里最老快照时间特别重要如果最老快照是三个月前的说明清理策略没有按预期执行要么是配置错误要么是有长时运行的事务一直持有旧快照导致无法清理。我遇到过一种情况某个 Flink 作业配置了长时运行的 Kafka 事务导致 Iceberg 的旧 snapshot 一直不能被清理metadata 目录膨胀到几个 GB每次 commit 都要复制一份超大 manifest 列表提交延迟从秒级变成分钟级。孤儿文件是另一个容易被忽略的问题指的是写了文件但 commit 失败留下的脏数据。Hudi 和 Iceberg 都有 orphan file cleanup 工具但要靠运维定期触发。监控孤儿文件数量的方式同样是通过扫描表目录把文件清单和元数据列表对比找出不在任何 snapshot 里的文件。我给出的实操建议是为每张表配置一个元数据健康档案包含快照数、metadata 文件总大小、孤儿文件数。每个月做一次全量巡检对异常表单独治理。快照保留策略我一般建议保留最近 20-30 个快照或者保留 72 小时内的快照满足时间旅行需求即可不需要无限保留。4.3 冷热分层与生命周期管理存储成本的最后一道闸聊到存储就不能不提成本。数据湖的存储成本会随着数据量线性增长而很多表的数据其实只在一两周内有价值之后几乎不会被访问。冷热分层是成本治理最有效的手段原则很简单把热数据放在高性能存储上把冷数据迁移到低频存储或者归档存储比如 HDFS 的冷存储策略、对象存储的 IA/Archive 类型。监控层面需要做的是识别只写不读的表。通过 Audit Log 分析访问频率找出过去 30 天内没有读操作但持续接收写入的表这些是冷数据迁移的首要候选。另一个指标是每张表的存储成本估算按存储类型单价换算出月度成本做一张成本大屏让业务方看到自己这一亩三分地烧了多少钱。数据湖运维如果只管性能不管成本是不够完整的。5. 数据质量与业务价值监控体系不能只盯系统不挂很多团队的监控体系停留在服务活着、任务跑完的层面但数据湖的价值最终体现在数据本身的质量上。一个数据湖即使存储稳定、任务零失败如果写进湖里的数据是脏的、重复的、不完整的那这个湖对业务来说依然毫无价值。所以监控体系必须从基础设施健康度延伸到数据可信度。5.1 数据质量的三级监控表、分区、字段我推荐按表-分区-字段三个维度建立数据质量监控。表级维度关注全表行数的变化趋势、主键唯一性比率、表的总大小。这些指标能发现大范围的写入逻辑错误。比如某天全表行数突降 50%大概率是代码变更导致数据被过滤掉了这种问题靠任务成功率监控完全看不出来。分区级维度关注每一个分区是否在预期时间产出、分区行数是否符合历史趋势。分区级监控对及时性问题最有效能定位到具体是哪一层调度卡住导致的链式延迟。字段级维度关注关键字段的有效率、非空率、枚举值分布。比如一个订单状态字段历史分布是已完成 60%、待支付 30%、其他 10%某天突然变成已完成 90%这就要告警了很可能上游业务系统改了字段含义或者代码里硬编码了状态值。5.2 数据质量监控的落地方案实操上我建议用独立的质量巡检任务来实现不依赖具体的表格式。每天凌晨跑一个 Spark 作业读取上一张监控配置表记录每张表的质量规则然后按规则执行 SQL 检查把结果写入质量结果表。Grafana 上配置质量看板展示各张表的质量分或各项规则的通过率。质量分的计算方式可以简单一些每个规则按时效性设置不同权重比如主键唯一性是硬规则不通过扣 50 分非空率波动是软规则不通过扣 10 分。每张表每天一个总分低于 80 分进 P1 告警60 分以下进 P0。这种量化方式让业务方也能直观理解数据质量状况。5.3 数据血缘与影响分析把质量问题和业务联系起来数据湖的数字资产很多一张表出问题可能影响下游十几张表和应用。我强烈建议在数据湖平台上维护一套数据血缘关系至少记录表 A 被表 B 读取、表 B 被报表 C 使用这种级别的上下游依赖。运维的价值在于当表 A 的质量分下降时能自动计算出影响范围然后给下游负责人发定向通知你的上游表 A 今天质量分只有 62 分你的报表 C 可能会受影响。这种能力比任何告警都更能体现运维的专业价值也更容易获得业务方的认可。6. 监控工具链怎么选自建 Prometheus 组合是数据湖运维最稳妥的起点聊完指标和告警策略最后说说工具选型。数据湖监控的工具有三条路线商业大数据平台自带的监控模块、开源大数据组件自带的 web UI、自建 Prometheus Grafana 的组合。我的建议是如果团队没有特殊合规要求自建 Prometheus Grafana Alertmanager 是最稳妥的选择理由很简单数据湖的表格式更新迭代太快商业平台的监控模块往往滞后组件自带的 web UI 又太碎片化HMS 一个页面、Hudi 一个页面、Flink 一个页面没法统一看。Prometheus 的 pull 模型和丰富的 exporter 生态能把这些指标全部拉到一个地方。6.1 监听哪些组件Exporter 清单我列一下我们在用的采集清单基本覆盖了前面提到的分层监控对象。基础设施层用 node_exporter 采集 CPU、内存、磁盘、网络存储层的 HDFS 用官方 JMX exporter 或者自研的 hdfs_exporter 采集 NameNode RPC 指标、DataNode 容量、块数量。元数据层的 HMS 用 JMX exporter 暴露线程池、连接池指标同时通过 SQL 探活的方式定期执行一条轻量查询判断服务是否真的可用。计算引擎层Spark 用 Spark Metrics 推送或者 PrometheusPushGateway 方式采集 Driver/Executor 的 GC、Shuffle、任务状态Flink 用 Flink 官方 metrics reporter 直推 Prometheus。数据资产层的指标则需要自研写一个定时 Spark 任务扫描表的文件分布、快照数量、分区产出情况将结果写入 MySQL 或者 ClickHouse再由 Prometheus 的 SQL exporter 拉取。6.2 告警配置的三个实战建议一是告警持续时间要大于指标振荡周期。Prometheus 的告警规则里有 for 参数建议至少配置 5 分钟避免抖动触发误报。比如 GC 指标经常有周期性尖峰如果不加 for 参数可能一天收几百条毫无意义的告警。二是告警路由要搭好。Alertmanager 的 route 配置要按团队和级别分流P0 走电话或者连续多次 IM 通知P1 走值班群P2 走日报。别把所有告警发给所有人否则一周后没人看告警。三是告警要带上下文。告警内容里除了指标名和当前值一定要带上影响判断的信息比如小文件数量超过阈值可能影响查询性能建议检查 compaction 是否正常执行。运维人员收到告警的第一时间是判断严重程度而不是先去查这个指标意味着什么。6.3 对接到个人系统企业微信/钉钉/飞书都能做题目的热词里有prometheus监控部署对接到个人系统这块我给一个通用做法。Alertmanager 的 webhook receiver 很成熟写一个小的 webhook 转发服务接收 Alertmanager 的告警 JSON然后调用企业微信机器人、钉钉机器人或者飞书机器人的 webhook 接口发送消息。消息格式上建议用卡片格式带上告警名称、级别、当前值、触发时间、跳转 Grafana 的链接。转发服务用 Go 或者 Python 写几十行代码就能搞定部署为一个容器服务给 Alertmanager 配一个 webhook 地址就完成了。我个人在实际运维中还有一个体会Grafana 的看板不要做得太复杂按前面说的监控分层分别建几个核心看板基础设施一张、存储与元数据一张、计算引擎一张、数据资产与质量一张。每张看板只放最重要的指标别什么指标都往上堆。看板是给人眼看的信息密度太高反而起不到快速定位的作用。数据湖的监控和运维是一场持久战建湖只是交了一张入场券真正拉开差距的是你能不能提前发现小文件膨胀的趋势、能不能在元数据服务被打满之前收到告警、能不能在数据质量恶化之前拦住它。这些能力不是一天建成的但每多配一个指标、每多跑一次巡检湖的可靠性就多一分。
返回列表