为什么 Iceberg 在数据湖领域这么火

最近打开技术社区,满眼都是 Apache Iceberg。无论是在大厂的架构分享中,还是在云厂商的推介里,它都占据了"C位"。

很多刚接触大数据的同学可能会感到困惑:我们不是已经有 HDFS 了吗?不是有 Hive 了吗?甚至文件格式我们也用了 Parquet 和 ORC,为什么还需要一个 Iceberg?它到底是个什么东西?

今天这篇文章,笔者就剥开那些高大上的术语,用最通俗的大白话,带大家看透 Iceberg 火爆背后的逻辑,顺便把 Parquet 这些相关概念也一并理清楚。


01 | 痛点:传统数据湖的"烂泥潭"

在聊 Iceberg 之前,我们得先看看它的"前辈"们------传统数据湖(基于 Hive 也就是文件夹管理模式)有什么问题。

① 数据的"隔离性"差(读写打架)

想象一下,你正在往一个 Hive 表里写数据(比如 INSERT INTO),任务跑了一半。
结果是: 虽然任务没结束,但文件已经产生在文件夹里了。这时候如果有下游任务来读取,就会读到"写了一半"的数据(脏读)。这在金融或对数据准确性要求高的场景下,简直是灾难。

② 修改数据简直是噩梦

在大数据领域,我们通常只做"追加(Append)",很少做"修改(Update)"或"删除(Delete)"。

如果你想修改 Hive 表里的一行数据,通常的做法是:把整个分区甚至整张表的数据读出来,改好,再全部写回去。 这就好比为了修一个灯泡,把整栋房子拆了重建,效率极低。

③ 文件列表(Listing)慢到怀疑人生

当数据量达到 PB 级别,一个表下面可能有几百万个小文件。当你执行 Select * 或者做查询计划时,系统需要去对象存储(如 S3 或 HDFS)上把这几百万个文件列举出来(List 操作)。
痛点: S3/HDFS 的 List 操作在文件很多时非常慢,且不稳定,经常导致任务卡在"Listing files"阶段很久,甚至 OOM(内存溢出)。

为了解决这些"烂泥潭"问题,Table Format(表格式) 的概念应运而生,而 Iceberg 就是其中的佼佼者。


02 | 核心:厘清"文件格式"与"表格式"

很多小白容易混淆 ParquetIceberg 的关系。这里笔者做一个最直观的比喻。

① Parquet 是"集装箱"

Parquet (还有 ORC、Avro)是 文件格式(File Format)

它决定了数据在磁盘上是怎么摆放的。比如 Parquet 采用列式存储,压缩率高,查特定列很快。

  • 角色: 它只负责存数据本身(Data),它不知道这批数据属于哪个表,也不知道这一天的数据是不是完整的。

② Iceberg 是"物流管理系统"

Iceberg表格式(Table Format)

它不存储实际的数据内容(数据还是存在 Parquet 里),它存储的是 元数据(Metadata)

  • 角色: 它记录了一张表里有哪些 Parquet 文件(Manifest),这些文件是属于哪个版本的,哪些文件被删除了,哪些是新加的。

一句话总结:Iceberg 是管理 Parquet 文件的大脑,而 Parquet 是存储数据的躯干。


03 | 揭秘:Iceberg 为什么能"火"?

Iceberg 之所以火,是因为它通过一套巧妙的 元数据管理机制(Snapshot 快照机制),完美解决了上面提到的痛点。我们来看看它最牛的几个能力。

① ACID 事务能力

还记得刚才说的"读写打架"导致的脏数据吗?

Iceberg 引入了数据库领域的 ACID 能力。当你写入数据时,Iceberg 会生成一个新的"快照(Snapshot)"。

  • 原理: 只有当数据全部写完,Iceberg 才会原子性地把"当前版本指针"指向这个新快照。
  • 效果: 读者要么读到旧版本,要么读到完整的新版本,永远不会读到"写了一半"的数据,实现了读写分离。

② 极速的查询规划(不依赖 Listing)

这是 Iceberg 性能起飞的关键。

传统 Hive 查数据,需要去文件系统里 List 所有文件。而 Iceberg 在自己的元数据文件(Manifest Files)里已经记录了每个数据文件的路径、行数、甚至列的最大值最小值。

  • 效果: 查询时,引擎直接读元数据就知道要扫哪些文件(Data Skipping),直接跳过不相关的文件,完全不需要去调用缓慢的 HDFS/S3 List 接口。

③ 隐藏技能:时间旅行(Time Travel)

这是一个让开发者大呼"真香"的功能。

既然 Iceberg 记录了每一次提交的"快照",那你就可以随意穿越回过去。

比如,你今天发现数据跑错了,想看看昨天这个时候数据长什么样,只需要简单的 SQL(以 Spark SQL 为例):

sql 复制代码
-- 笔者示例:查询 snapshot_id 为 123456789 时的状态 (按版本号查询)
SELECT * FROM my_table VERSION AS OF 123456789;

或者

sql 复制代码
-- 笔者示例:查询指定日期下午4点的数据状态 (按时间戳查询)
SELECT * FROM my_table TIMESTAMP AS OF '2025-12-16 16:00:00';

这对于排查 Bug 和数据恢复简直是神器。

④ 丝滑的 Schema 演进

在传统数仓里,想给一张大表改个列名或者调整列顺序,往往需要重写数据,或者面临数据错位的风险。

Iceberg 支持完整的 Schema Evolution。你改列名、改类型、加列,Iceberg 只需要修改一下元数据里的定义(Mapping),不需要动底层的 Parquet 文件。

  • 体验: 秒级完成表结构变更,对生产环境几乎无影响。

04 | 实战:Iceberg 在架构中的位置

为了让大家更清楚怎么上手,笔者梳理了一个现代数据平台的典型架构图。

  • 计算层(谁来做): Spark, Flink, Trino, StarRocks ------ 它们负责"算"和"写"。
  • 中间层(Iceberg): <-- Iceberg 就在这里
    • Catalog(目录): 记录表的最顶层入口(如 Hive Metastore, AWS Glue)。
    • Metadata(元数据): 管理快照、Manifest 文件列表。
  • 存储层(存哪里): HDFS / S3 / OSS / MinIO ------ 负责物理存储。
  • 文件格式(怎么存): Parquet / ORC / Avro ------ 负责物理编码。

工作流示例:

  1. Flink 实时消费 Kafka 数据。
  2. Flink 调用 Iceberg 的库,将数据转换并写入底层的 Parquet 文件。
  3. Flink 每隔一段时间(Checkpoint),通过 Iceberg 提交一次 元数据快照
  4. SparkTrino 感知到新快照,即可实时查询到几秒钟前刚写入的数据,实现"流批一体"。

05 | 总结与展望

为什么 Iceberg 会火?

因为它在不抛弃廉价存储(S3/HDFS)和成熟文件格式(Parquet)的前提下,赋予了数据湖像数据库(Database)一样严谨的管理能力。

对于小白来说,记住这三个公式:

  1. Iceberg != 存储软件(它是一个管理数据的协议/库)。
  2. Iceberg = 元数据管理 + 文件布局标准
  3. Iceberg 让数据湖里的数据变得"可信"、"可回溯"、"更强壮"。

目前,Iceberg 已经成为构建 Lakehouse(湖仓一体) 架构的事实标准之一。如果你还在用传统的 Hive 方式管理 PB 级数据,不妨尝试一下 Iceberg,它绝对会打开你新世界的大门。

相关推荐
zgxme2 天前
Iceberg Rest Catalog + OSS 实践踩坑记录:Polaris x-amz-content-sha256 报错 与 Nessie 配置
iceberg·database
StarRocks_labs3 个月前
StarRocks:Connect Data Analytics with the World
数据库·starrocks·iceberg·存算分离·lakehouse 架构
StarRocks_labs4 个月前
欧洲数字化养殖平台 Herdwatch 借力 Iceberg + StarRocks 提升分析能力
数据库·starrocks·iceberg·湖仓一体架构·herdwatch
朽木自雕,格物致知!4 个月前
iceberg FlinkSQL 特性
iceberg·flinksql
智海观潮5 个月前
Unity Catalog与Apache Iceberg如何重塑Data+AI时代的企业数据架构
大数据·人工智能·ai·iceberg·catalog
LiRuiJie5 个月前
基于Hadoop3.3.4+Flink1.17.0+FlinkCDC3.0.0+Iceberg1.5.0整合,实现数仓实时同步mysql数据
大数据·hadoop·flink·iceberg·flinkcdc
StarRocks_labs5 个月前
Lakehouse x AI ,打造智能 BI 新体验
大数据·starrocks·人工智能·iceberg·lakehouse·智能bi·湖仓分析
兰丰岐6 个月前
使用apache amoro + trino+minio搭建iceberg数据湖架构
iceberg·amoro·apache amoro
ClouGence6 个月前
MySQL + CloudCanal + Iceberg + StarRocks 构建全栈数据服务
数据库·mysql·iceberg·dba