数据齐没齐,Pinterest让机器说了算
📋 总体概括
Pinterest 用 Flink 追踪事件时间、Iceberg 元数据发布非回退水位线,让 PB 级 CDC 数据的分区定稿从人工经验变成机器可判的协议。本文拆解其架构选择与产业逻辑:元数据层正在成为数据平台的协调中枢,表格式之争进入数据操作系统阶段。
📄 正文
每个做数据平台的人都被同一个问题折磨过:上游一直在写,下游到底啥时候能跑?早了丢数,晚了烧钱。Pinterest 最近把这道题交给了机器——用 Apache Flink 追踪事件时间,用 Apache Iceberg 元数据发布一条不回退的水位线,让 PB 级 CDC 数据的"分区定稿"第一次有了可证明的判据。动作不大,信号不小:湖仓正在从"存得下"走向"算得准",元数据层正在升级为数据平台的协调中枢。
⏱️ 一条水位线,终结凌晨两点的等待
数据工程里最贵的不是算力,是"不知道什么时候可以开始算"。
先讲一个所有数据团队都熟悉的场景。凌晨两点,值班同学盯着监控大屏:上游 OLTP 库的变更日志正源源不断写进湖里,按天切的分区"看起来"已经有数据了,但没人敢拍板说后面不会再补。跑早了,迟到的事件漏算,报表数字第二天被业务方打脸;跑晚了,集群空转一整晚,成本报表又被财务点名。于是行业发明了各种土办法:给凌晨的任务配几小时缓冲、设人工确认节点、群里喊一嗓子"齐了没"。一句话,完整性判定长期靠猜。
Pinterest 的处境把这个问题放大到了极限。它的数据库接入框架面对的是 PB 级、持续不断的 CDC 数据流——变更永远在路上,分区永远"还没完全就绪"。据 InfoQ 报道(作者 Leela Kumili),Pinterest 引入了基于事件时间的分区定稿机制:Flink 负责追踪事件时间,Iceberg 元数据负责发布一条非回退的水位线,下游作业据此判断持续写入的 CDC 数据何时"足够完整"、可以安全处理。
水位线在流计算里不是新概念,Flink 生态玩了很多年。真正的变化在落点:Pinterest 把它从计算引擎的内存状态,搬进了表元数据,变成了持久化、跨引擎、任何人可查的公开信号。这一步,把"数据完整性"从经验判断升级成了协议约定。判断数据齐没齐,从此不再问人,问元数据。
🔧 Flink 管时间,Iceberg 管公告
好架构的标志,是每个组件只干自己最擅长的那件事。
为什么时间判定交给 Flink?因为 CDC 日志重放天然乱序——业务上 10:01 发生的更新,可能比 10:03 的那条更晚到达。事件时间和处理时间是两码事:分区按事件时间切,就必须有人维护"业务时间走到哪了"的权威视图。Flink 的水位线机制正是干这个的:基于已观测到的最大事件时间,减去允许的乱序容忍度,单调向前推进。
那为什么发布交给 Iceberg,而不是再造一个协调服务?答案藏在下游的拓扑里:批作业、流作业、交互查询引擎,全都在读 Iceberg 表。元数据就是天然的公告栏——水位线随表元数据提交,所有引擎读到的视图天然一致,不需要下游再去对接第四个系统。而非回退是整个机制的安全带:哪怕作业故障重启,水位线也绝不能倒退,否则下游会把已经处理过的分区重新误判为"又没齐了",全局调度跟着抖动。
这套设计的本质是"元数据即协调平面"。表格式正在从定义"表长什么样",扩展到承载"表处于什么状态"。据多位接近流计算社区的人士讲,把水位线写进开放表格式的想法业内早就有,难的不是想法而是工程:单调性保证、故障恢复语义、跨引擎可见性,每一项都是脏活累活。Pinterest 的价值在于把脏活干完,并且跑在了 PB 级生产流量上。
📊 完整性判定的三代演进
一个行当成熟的标志,是判断标准从"人的经验"变成"机器的协议"。
第一代,固定延迟。给 T+1 的任务配一个拍脑袋出来的缓冲时间,缓冲够大就不出事,代价是资源浪费和长尾迟到数据的静默丢失。第二代,人工确认。看板加值班、人眼判断,灵活但不可复制,人一疲劳就出事故,而且判定口径全在老员工脑子里,换个人就走样。第三代,就是 Pinterest 落地的这条路径:事件时间水位线写进元数据,判定依据从"经验值"和"目测"变成了一条可比较、可审计的单调标记。
下面的定位图可以看清这几代机制各自的位置:
再叠一张对比表,差异会更直观:
| 机制 | 判定依据 | 误判风险 | 运维成本 | 适合规模 |
|---|---|---|---|---|
| 固定延迟 | 拍脑袋的经验值 | 高,迟到数据被漏算 | 低 | 中小数据量 |
| 人工看板确认 | 值班同学目测 | 高,依赖人的状态 | 高,持续占用人力 | 中等规模 |
| 自研协调服务 | 外挂健康检查 | 中,口径易漂移 | 很高,需专人长期维护 | 大型平台 |
| 事件时间水位线 | 元数据中的单调标记 | 低,语义可证明 | 中,直接复用开源 | PB 级及以上 |
规律很清晰:固定延迟的门槛最低,但在 PB 级规模下,误判的代价是重跑——一个分区重新计算烧掉的算力和等待时间,远超水位线机制的建设成本。这也是为什么越大的平台,越往"高门槛高价值"的右上角走。完整性判定这件事,正在从手工作坊走向工业化。
🏗️ 湖仓的下一站:协调中枢
表格式之争,正在从"存储格式之争"变成"数据操作系统之争"。
过去几年,开放表格式故事的核心词是"开放":摆脱专有格式锁定,让各种计算引擎自由读写,靠中立生态取胜。但 Pinterest 的实践展示了另一半常被忽略的价值:元数据不只是存储的事,还是数据流转的合同。分区定稿、数据就绪、一致性快照——这些协调语义,天然属于元数据层,而不是任何一个计算引擎。
这张图可以看清水位线机制的全貌——水面上是用户看到的信号,水面下才是真正的工程量:
顺着这个视角往下推:湖仓正在长出自己的"内核"。存储是外设,计算引擎是进程,元数据是内核——而水位线,是第一个跑在内核里的进程间通信原语。这对选型的启示很直接:评估表格式时,除了性能和生态,更要看元数据的扩展能力,能否承载未来更多的协调需求。只把 Iceberg 当"能被 Trino 读的 Parquet 管理器"的团队,会错过真正的价值层。
🚀 别造新轮子,但要懂轮子
务实主义,是大厂数据平台能长期活下去的通行证。
值得玩味的是,Pinterest 的方案里没有一个自研组件:Flink 是开源的,Iceberg 是开源的,做的是把两个成熟开源件按正确的姿势拼起来。反观国内,不少团队在调度系统外面挂了自研的"数据就绪通知服务",判定口径散落在调度配置、看板规则和群里的人肉确认三处,改一次上游表结构要联动改五个地方。据多位做过大规模实时数仓的平台负责人私下讲,这类自研协调服务最后大多沦为"没人敢动的祖传代码"。
AI 的到来让这件事更紧迫。训练数据集的完整性判定,本质上和管道分区定稿是同一类问题——"这批数据齐不齐、能不能开训",在 Data for AI 时代会越来越多地依赖机器可判的信号,而不是负责人拍板。水位线这种单调、可审计的标记,天然适合作为训练数据版本的就绪凭据。此外还有一个常被低估的收益:误判重跑是数据平台最大的隐性成本之一,一份可证明的完整性凭据,省下的算力账单往往比方案本身的投入高一个量级。
🧭 写在最后
一条水位线,看着是个工程小优化,实际是湖仓从"能存"到"能协同"的跃迁信号。可以预见,表格式元数据会承载更多协调语义:数据契约、一致性视图、血缘锚点,会一个个跟着水位线进来。下一轮数据平台的竞争,不在算力,不在存储介质,而在元数据层——谁先把"数据状态"做成一等公民,谁就握住了下一代的定义权。Pinterest 这次只是先落了一子,牌局才刚开始。
本文由本站 AI 辅助聚合生成,原始来源如下: