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 的典型架构:
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——选型要看延迟要求和团队技术栈