Pinterest以Flink和Iceberg实现CDC分区最终确认
Pinterest为下一代数据库摄取框架设计了基于事件时间的分区最终确认机制,让下游任务能够判断流式数据何时已足够完整并安全消费。方案借助Apache Flink跟踪事件时间进度,再通过Apache Iceberg发布不会回退的最终确认水位线,解决CDC数据在自然时间区间结束后仍可能延迟到达的问题。
该摄取平台由CDC、Kafka、Flink、Spark和Iceberg组成,负责将MySQL、TiDB及KVStore中的数据库变更写入分析表,规模达到PB级,并支撑数千条数据流水线。Pinterest称,线上变更通常可在15分钟至1小时内用于分析。传统批处理以任务完成作为分区就绪信号,但流式摄取会持续提交变更,缺少明确的结束时点。
新机制运行在Flink到Iceberg的Sink内部。系统从每条CDC记录提取预先配置的事件时间,在Flink执行Checkpoint时收集最小值、最大值和百分位数等统计信息,并将结果写入Iceberg快照摘要。事件时间分布通过t-digest压缩至数百字节,在控制元数据开销的同时保留足够精度。
Iceberg提交完成后,系统根据最近若干次Checkpoint的统计结果计算分区最终确认水位线。默认策略会取可配置数量的近期提交中的最小事件时间,并向下取整到相应小时。该水位线只会单调递增,能够避免延迟到达的数据导致已发布值回退;采用百分位数策略时,则可以牺牲部分完整性来换取更高的数据新鲜度。
水位线以Iceberg表属性形式保存,下游传感器无需额外协调服务即可读取。Spark执行CDC更新插入提交时,也会把相关元数据传递到基础表。由此,分区最终确认不再是批处理任务结束后的附带结果,而成为与数据一同存储的完整性信号。该设计结合了Flink水位线对乱序事件时间的追踪能力和Iceberg快照对表元数据的持久化能力。
时间线展示了延迟到达的CDC事件、Flink检查点、事件时间推进过程,以及持续递增的最终确认水位线。有工程师认为,这一方案准确体现了流处理与批处理的取舍:在保持数据新鲜度的同时,尽量保留批处理原有的完整性保证。
Pinterest通过Flink-to-Iceberg Sink的扩展点落地该机制,其中累加器负责收集记录统计信息,提交处理器则围绕Iceberg提交执行最终确认逻辑。此外,Apache Iceberg社区正在讨论扩展IcebergSink,以支持水位线等面向下游集成的自定义可提交元数据。
本文基于公开渠道信息整理,内容可能存在不准确或遗漏之处,不代表本站立场,如内容涉及侵权或错误,请联系我们处理。
阅读原文