2. 数据湖与湖仓一体基础
要理解 Flink 与 Iceberg 组合的价值,必须先厘清数据湖、湖仓一体与实时湖仓三者的演进关系。很多团队在选型时把“能存海量文件”误当成数据湖的全部能力,结果在事务一致性、更新效率和实时分析上反复踩坑。本节从架构演进出发,建立后续实战所需的认知底座。
2.1 数据湖的演进:从“能存”到“能管”
第一代数据湖以 HDFS 为核心,解决的是海量原始数据的低成本存储问题。它把结构化、半结构化和非结构化数据统一落地为文件,计算与存储解耦,扩展性极强。但这一代数据湖缺乏表语义:没有事务、没有 schema 演进、没有快照隔离,文件一旦写错只能整目录重刷,小文件问题也迅速恶化。
第二代数据湖引入“表格式”层,代表是 Hive Metastore 加 Parquet/ORC。它让文件具备了分区和 schema 概念,但元数据与数据文件之间没有原子提交协议,并发写入时容易出现“看到一半数据”的脏读,更新和删除几乎不可用。
第三代数据湖即“湖表格式”时代,以 Iceberg、Hudi、Delta Lake 为代表。它们把表当作一组快照来管理,通过元数据树实现 ACID、时间旅行、schema 演进和隐藏分区。Iceberg 的元数据层级为 metadata file → manifest list → manifest file → data file,每次提交生成新快照,读端始终看到一致版本。这正是实时湖仓能够“边写边读”的根基。
2.2 湖仓一体架构:把数仓能力下沉到湖上
湖仓一体并非“数据湖 + 数据仓库”的简单拼接,而是在数据湖存储之上补齐数仓级能力。其核心架构可拆为四层:
- 存储层:对象存储(S3、OSS、HDFS)承载 Parquet/ORC 数据文件,成本低、弹性好。
- 表格式层:Iceberg 提供 ACID、快照、schema 演进、分区演进与时间旅行,是湖仓的“事务内核”。
- 计算引擎层:Flink 负责流式写入与实时 ETL,Spark/Trino 负责批处理与交互查询,多引擎共享同一份表。
- 元数据与目录层:Hive Metastore、REST Catalog 或 Nessie 统一管理表位置与快照指针,保证多引擎看到一致视图。
与传统 Lambda 架构相比,湖仓一体用一份存储同时服务批与流,消除了“实时链路和离线链路各存一份、口径不一致”的顽疾。Flink 在其中承担实时写入与增量加工,Iceberg 承担事务与版本管理,两者结合即形成实时湖仓。
2.3 实时湖仓的核心价值
实时湖仓的价值可归纳为四点:
- 时效性:数据分钟级甚至秒级可见,支撑实时风控、实时推荐等场景。
- 一致性:快照隔离保证读写不互相阻塞,避免脏读与部分可见。
- 成本:一份存储替代多套链路,对象存储成本远低于专用数仓。
- 开放性:Iceberg 是开放表格式,Flink、Spark、Trino、StarRocks 均可直接读取,避免厂商锁定。
关键判断:实时湖仓不是“把离线任务改成流任务”这么简单,而是要求写入端具备事务提交能力、读取端具备快照解析能力。Iceberg 的 snapshot 机制正是这两端的契约。
2.4 典型应用场景与行业案例
| 场景 | 数据特征 | Flink + Iceberg 的作用 |
|---|---|---|
| 实时数仓 | 订单、支付、日志持续写入 | Flink 流式入湖,Trino 分钟级查询 |
| CDC 入湖 | MySQL Binlog 变更频繁 | Flink CDC 解析后 upsert 到 Iceberg |
| 实时风控 | 低延迟、需回刷历史 | 快照时间旅行支持规则回测 |
| 用户行为分析 | 埋点量大、schema 多变 | schema 演进避免全量重刷 |
以某电商平台为例:订单库通过 Flink CDC 实时捕获变更,经 Flink 做维表关联与指标聚合后写入 Iceberg 明细表与聚合表;下游 Trino 提供 BI 查询,Flink 再从 Iceberg 读取增量快照生成实时大屏。整条链路只有一份存储,离线与实时口径完全一致。另一家金融企业用 Iceberg 时间旅行做风控规则回测,直接读取历史快照,无需重新跑批。
2.5 常见误区与复盘
误区一:把 Iceberg 当成“更快的 Hive 表”。Iceberg 的收益来自快照与提交协议,若仍按小时级批写、不做小文件合并,收益有限。
误区二:忽视元数据服务。多引擎并发写入时,Catalog 的锁与提交冲突处理不当会导致提交失败,需选择支持原子提交的 REST Catalog。
误区三:只关注写入不关注读取。实时湖仓要求读端能解析快照,若查询引擎版本过旧,可能读不到最新提交。