流处理系统

流批一体数据管道架构

🌊
<1s
端到端延迟
99.9999%
数据可靠性
TB级
日处理量
Exactly-Once
语义保证

研究背景与动机

现代数据基础设施面临一个根本性的架构选择:Lambda架构将数据管道分为批处理层和流处理层两条独立的链路,带来了双份代码维护、结果不一致以及运维复杂度等固有问题。Kappa架构虽然通过只保留流处理链路简化了架构,但在大规模历史数据回放、Schema变更处理等方面仍面临挑战。Apache Iceberg等开放表格式的出现为流批融合提供了新的可能性——它将表格式与计算引擎解耦,允许Flink/Spark/Trino等不同引擎以一致的方式访问同一份数据。这一「存储-计算分离」的设计理念借鉴了数据库领域的经典架构原则,将其推广到数据湖的开放生态中。

本项目的核心目标是:基于Apache Flink与Iceberg构建流批统一的数据处理管道,重点探索Exactly-Once状态一致性保证与Schema Evolution的协同机制,以及在TB级日志处理场景下的端到端性能优化。项目还深入研究了数据质量保障体系与自适应Checkpoint策略等运维层面的关键问题。

技术栈

  • Apache Flink
  • Apache Iceberg
  • Apache Kafka
  • Apache Arrow
  • MinIO
  • RocksDB
  • DataFusion
  • Parquet

核心技术贡献

  • Flink-Iceberg两阶段提交协议 — 设计了Flink与Iceberg之间的两阶段提交(2PC)协议,确保流处理作业在Checkpoint机制下实现Exactly-Once语义。关键设计包括:(1) Flink Checkpoint触发时,所有Sink算子将未提交的Iceberg Data File列表写入Checkpoint状态;(2) Checkpoint完成时,Coordinator算子原子性地执行Iceberg的Commit操作;(3) 故障恢复时,从最近完成的Checkpoint重新读取未提交文件列表并重放Commit。该协议在保证Exactly-Once的同时,将Commit延迟控制在Checkpoint间隔的1.2倍以内。
  • Schema Evolution的在线协同 — 探索了流处理场景下Iceberg Schema Evolution(增加列、删除列、重命名列、修改列类型)与Flink状态后端的协同机制。提出了一种基于Avro Schema兼容性检查的在线Schema变更方案:当上游数据源的Schema发生兼容性变更时,Flink作业无需重启即可自动适应新的Schema,同时保持状态的正确性。通过Arrow的零拷贝列式格式,实现了Schema变更后新旧列数据的高效合并。
  • 基于Arrow的零拷贝数据交换 — 在Flink算子链内部使用Apache Arrow作为数据交换格式,避免了Java对象序列化/反序列化的开销。关键优化包括:(1) 利用Arrow的Off-Heap内存管理减少GC压力;(2) 利用Arrow Flight的gRPC流式传输协议实现跨进程零拷贝数据交换;(3) 利用Arrow的列式内存布局实现向量化表达式求值。综合优化将数据交换性能提升3.2倍。
  • 自适应Checkpoint策略 — 针对流处理场景中数据流量波动的问题,设计了基于流量预测的自适应Checkpoint间隔调整策略。该策略通过指数加权移动平均(EWMA)预测下一周期的数据到达速率,动态调整Checkpoint间隔以平衡故障恢复时间(RTO)与正常运行时的Checkpoint开销。在模拟的TB级日志处理场景中,自适应策略将平均Checkpoint开销降低了37%。
  • 数据质量保障体系 — 构建了基于数据契约(Data Contract)的质量保障体系:在数据管道的入口和关键转换节点定义Schema约束、值域约束和业务规则约束,Flink作业在运行时验证每一条数据的合规性。异常数据被路由到死信队列(Dead Letter Queue),通过自动化的数据修复流程(如缺失值填充、格式标准化)进行处理后再重新注入管道。该体系实现了六个9(99.9999%)的数据可靠性标准。

工程挑战与解决方案

流批一体数据管道在工程实践中面临多个关键挑战。首先是流批语义差异:批处理假设数据是有限的、完整的,可以进行全局排序和聚合优化;流处理则必须处理无界数据流,采用窗口和水印(Watermark)等机制来处理乱序和延迟到达的数据。我们的解决方案是在Iceberg表格式层面统一流批的读写接口——批处理通过Snapshot Read获得一致的快照视图,流处理通过Incremental Read读取自上次Checkpoint以来的增量变更,两者在Iceberg的Manifest文件层面实现了语义的统一。

其次是数据质量保障的自动化:在TB级日志处理场景中,上游数据源的格式漂移(Schema Drift)是常态而非例外。我们构建的数据契约(Data Contract)机制在管道入口自动检测Schema变更,对于向后兼容的变更(如增加可选列)自动放行并更新Iceberg表的Schema,对于不兼容的变更(如删除必需列)将异常数据路由到死信队列并触发告警。这一自动化机制将数据质量问题的平均修复时间(MTTR)从数小时缩短到分钟级。

系统架构

流批融合架构:以Apache Iceberg为统一的表格式层,Flink负责实时流处理(毫秒级延迟),Spark负责大规模批处理与历史数据回填,Trino提供交互式Ad-hoc查询。三者在Iceberg的Catalog层实现元数据共享,确保流处理和批处理看到一致的数据视图。

存储分层策略:热数据(近24小时)存储在Kafka Topic中提供毫秒级实时消费,温数据(近30天)以Iceberg格式存储在MinIO对象存储中提供秒级查询,冷数据(30天以上)通过Iceberg的Snapshot Expire与Orphan File Clean机制自动归档。MinIO的纠删码(Erasure Coding)提供了高可用性保障。

返回研究项目