1. 课程导学与前置准备:Iceberg是什么?为什么需要实时写入?Flink与Iceberg的生态关系

1.1 这门课到底讲什么?

先说说我为什么想做这门课。

过去几年,我一直在跟数据湖打交道。从Hive到Hudi,再到Iceberg,踩了不少坑。尤其是实时写入这块,很多人以为把Flink连上Iceberg就能跑,结果一上线就出问题——小文件爆炸、数据不一致、查询延迟飙升。

这门课,说白了就是把我这些年积累的实战经验,系统性地梳理出来。从Iceberg的核心原理,到Flink如何与它深度集成,再到生产环境中的调优和运维,一条线讲透。

课程核心目标:

  • 理解Iceberg的底层设计,知道它为什么能解决传统Hive的痛点
  • 掌握Flink实时写入Iceberg的最佳实践,避免常见坑
  • 能独立设计并部署一套生产级的实时数据湖方案

1.2 Iceberg是什么?

Apache Iceberg,一个开源的表格式(Table Format)。嗯,注意这个词——它不是存储引擎,也不是计算引擎。它定义的是「表」这个层面的元数据和组织方式。

你可以把它想象成一张「地图」。数据文件散落在HDFS或S3上,Iceberg就是这张地图,告诉你哪些文件属于哪个分区、哪个快照、哪个版本。

Iceberg的核心能力:

  • ACID事务:支持并发写入和读取,不会读到脏数据
  • 快照隔离:每次写入生成一个快照,读操作基于快照,互不干扰
  • 分区演进:表的分区规则可以随时改,不需要重写历史数据
  • 隐藏分区:用户不需要手动指定分区字段,Iceberg自动推导
  • 时间旅行:可以查询任意历史版本的数据

我在项目中遇到过最典型的场景:业务方要求「我要看昨天下午3点的数据状态」。用Hive的话,你得重新跑一次分区。用Iceberg,一行SQL就搞定——SELECT * FROM table FOR SYSTEM_TIME AS OF '2024-03-15 15:00:00'。

1.3 为什么需要实时写入?

传统的数据湖,比如Hive,写入模式是批量的。每天凌晨跑一次ETL,把数据从业务库同步到Hive表。这种模式在几年前还行,但现在不行了。

为什么?

  • 业务实时性要求越来越高:用户下单后,希望立刻看到订单状态更新;风控系统需要秒级识别异常交易
  • 数据量爆炸:IoT设备每秒产生百万级事件,批处理根本扛不住
  • 存储成本:批处理会产生大量中间文件,Iceberg的实时写入能有效控制小文件数量

说白了,实时写入不是「锦上添花」,而是「刚需」。我见过一个电商客户,之前用Hive做离线报表,每天凌晨4点跑完,早上8点业务才能看到昨天的数据。后来换成Flink+Iceberg的实时链路,延迟从12小时降到30秒。嗯,这就是差距。

避坑指南: 我曾经以为实时写入就是「把批处理改成流处理」那么简单。结果第一次上线,Iceberg表的小文件数量从几百个暴涨到几十万,查询直接卡死。后来才明白,实时写入需要合理配置提交频率、文件大小阈值和压缩策略。这些内容,后面章节会详细讲。

1.4 Flink与Iceberg的生态关系

Flink和Iceberg,一个是流计算引擎,一个是表格式。它们的关系可以用一句话概括:Flink负责「怎么算」,Iceberg负责「怎么存」。

具体来说:

  • Flink从Kafka/Pulsar等消息队列读取实时数据流
  • Flink对数据进行处理(过滤、聚合、关联等)
  • Flink通过Iceberg的Sink将结果写入数据湖
  • 下游的查询引擎(Spark、Trino、Flink SQL)从Iceberg读取数据

这个链路里,Iceberg扮演的是「存储层」和「元数据层」的双重角色。它不参与计算,但它决定了数据怎么组织、怎么被高效读取。

Flink + Iceberg 的典型架构:

Flink + Iceberg 实时数据湖架构 数据源 Kafka / Pulsar / CDC Flink 流计算引擎 实时ETL / 聚合 / 关联 / 状态管理 Iceberg 表格式 ACID事务 / 快照隔离 / 分区演进 分布式存储 HDFS / S3 / OSS Spark Trino Flink SQL 关键优势 • 秒级数据可见 • 精确一次语义 • 小文件自动合并 • 查询性能稳定

1.5 为什么选Flink而不是Spark Streaming?

这个问题经常有人问。我的回答是:看场景。

对比维度 Flink Spark Streaming
处理模式 真正的逐条流处理 微批次(Micro-batch)
延迟 毫秒级 秒级(取决于批次间隔)
状态管理 原生支持,强一致性 依赖外部存储
与Iceberg集成 官方支持,API成熟 社区支持,功能稍弱
适用场景 实时ETL、事件驱动、CDC 准实时分析、批量+流混合

我个人习惯:如果业务要求秒级延迟,或者需要复杂事件处理(CEP),无脑选Flink。如果延迟容忍度在分钟级,且团队Spark技术栈更成熟,Spark Streaming也能用。但注意,Iceberg官方对Flink的支持更深入,比如动态表、流式读取这些特性,Spark那边还没完全跟上。

1.6 前置知识准备

这门课不是零基础入门。你需要具备以下基础:

  • Java/Scala基础:Flink和Iceberg都是JVM生态,至少能看懂代码
  • Flink基础概念:知道DataStream、Table API、Checkpoint是什么
  • Hadoop生态基础:了解HDFS、Hive、Hive Metastore的基本用法
  • SQL基础:能写简单的查询和DDL语句

如果你对Flink完全陌生,建议先花一周时间跑一遍Flink官方文档的Quick Start。嗯,我当年就是这么过来的。

注意: 课程中的代码示例基于以下版本,请尽量保持一致,避免版本兼容性问题:

  • Apache Flink 1.18+
  • Apache Iceberg 1.5+
  • Hadoop 3.3+
  • Java 11+

1.7 本章小结

这一章我们聊了:

  • Iceberg是什么——一个表格式,不是存储引擎
  • 为什么需要实时写入——业务实时性要求、数据量爆炸、成本控制
  • Flink与Iceberg的关系——Flink负责计算,Iceberg负责存储,两者互补
  • Flink vs Spark Streaming——选型要看延迟要求和团队技术栈