Pinterest 下一代数据库摄入框架中的分区最终化
本文介绍了一种解决方案,用于确定数据在 Pinterest 新数据库摄入框架中何时已足够完整以供下游消费。该框架基于 Kafka、Flink 和 Iceberg 等技术构建,支持连续数据处理,这给原本依赖单次运行批作业进行最终化的批作业带来了挑战。按时间列分组的时分数据允许消费者读取特定切片,而无需扫描整个表。在批处理系统中,一旦生产者完成写入,分区即被视为最终化;然而,流处理框架会持续向分区写入数据,使得传统意义上的最终化变得困难。为此,Pinterest 在 Flink 到 Iceberg 的 Sink 中开发了一种基于事件时间的分区最终化机制。该系统从记录中提取事件时间,收集 Flink Checkpoint 之间的最小和最大事件时间等统计信息,并将其存储在 Iceberg 的快照摘要中。随后,一个算法利用这些统计信息生成水印,指示分区被视为完整的截止点,并确保该值始终递增。该水印作为 Iceberg 表的属性进行存储,允许下游作业查询它以触发处理。该机制通过 Upsert 作业传播到基础表,确保信号随数据一同传递。该实现利用了可扩展的 Iceberg-Flink Sink 能力:累加器在 Writer 子任务中收集记录统计信息,而 Commit 处理器在 Iceberg 提交前后执行自定义逻辑。此设计在无需配置扩展时实现零开销,并确保分区最终化能够高效地集成到流数据处理管道中。