---
url: /iceberg/introduction.md
description: Apache Iceberg是什么？开源数据湖表格式王者，Snowflake、Databricks、AWS都在用，五分钟搞懂数据湖仓核心技术
---

# 认识Apache Iceberg

你有没有遇到过这种情况：同一份数据，Spark 写的，Trino 查不了；加了列，历史数据全变 NULL；想回滚到昨天的数据状态，发现根本没有快照。

别慌，你不是一个人在战斗。数据湖的"野路子"时代，这些问题几乎是每个大数据团队的噩梦。直到 Apache Iceberg 出现，把 SQL 表的可靠性和数据湖的灵活性焊在了一起。

更劲爆的是，2026 年业内已经达成共识——**"表格式之战"结束了，Iceberg 赢了。** Snowflake、Databricks、AWS、Google、Microsoft 全部站队 Iceberg，连 Delta Lake 都通过 UniForm 协议向 Iceberg 靠拢。

> 当所有厂商都收敛到同一个开放格式时，战略风险就反转了——问题不再是"要不要用 Iceberg"，而是"为什么还要把数据锁在只有一个厂商能读的格式里"。

## 什么是 Apache Iceberg

Apache Iceberg 是一个**开放的数据湖表格式（Table Format）**，为海量分析型数据集而设计。它不是数据库，也不是查询引擎，而是一套定义"数据在存储层怎么组织、怎么管理"的规范。

打个比方：如果数据湖是仓库里堆满的货物，Iceberg 就是那套货架编号系统和出入库台账——货物还是那些货物（Parquet、ORC 文件），但有了这套系统，任何叉车（Spark、Trino、Flink）都能高效、安全地进出货。

Iceberg 最初由 Netflix 在 2017 年开发，用来解决海量数据在 S3 上的正确性和性能问题。2018 年进入 Apache 孵化器，2020 年毕业成为顶级项目。经过社区多年打磨，2026 年 5 月发布的 **1.11.0 版本**正式将 **V3 规范**推向生产可用，这是一个里程碑。

### 核心架构

Iceberg 的表由多层元数据管理，从上到下分别是：

* **Catalog（目录）**：表的入口，记录表的当前位置。支持 REST Catalog、Hive Metastore、JDBC、Glue 等多种类型
* **Metadata file（元数据文件）**：表的"身份证"，记录 schema、分区策略、快照列表
* **Manifest list（清单列表）**：快照的索引，指向一组 Manifest 文件
* **Manifest file（清单文件）**：数据文件的索引，记录每个数据文件的路径、分区值、列级统计信息
* **Data file（数据文件）**：实际存储数据的文件，通常是 Parquet 格式

这套分层设计的好处是：查询引擎不需要扫描整个目录，通过元数据层层定位，直接跳到目标数据文件。这就是所谓的**快速扫描规划（Fast Scan Planning）**——不用分布式引擎就能完成文件定位。

## Iceberg 的核心特点

**隐藏分区（Hidden Partitioning）**

传统 Hive 分区要求你在写入时手动指定分区值，查询时也得带上分区过滤条件，稍有遗漏就全表扫描。Iceberg 帮你把分区这件事"藏"起来了——你按 `event_time` 排序写入，Iceberg 自动按 `days(event_time)` 分区，查询时正常写 `WHERE event_time > '2026-08-01'` 即可，引擎自动裁剪分区。

**Schema 演进（Schema Evolution）**

加列、删列、改名、改顺序，都不需要重写数据文件。更关键的是，加列不会导致历史数据出现"僵尸数据"（被删除的数据意外复活）。V3 还支持**默认列值**，新增列时历史数据自动填充默认值，不用跑 backfill。

**时间旅行和回滚（Time Travel & Rollback）**

每次写操作都会生成一个新的快照（Snapshot）。你可以查询任意历史快照的数据，实现可复现分析。出了问题？一条命令回滚到之前的好状态。

**ACID 事务**

Iceberg 在最终一致的云对象存储（如 S3）上实现了**可序列化隔离（Serializable Isolation）**。读者永远不会看到半写状态的数据，多个并发写入者通过乐观并发控制自动重试。

**V3 新特性（1.11.0 生产可用）**

2026 年 5 月发布的 1.11.0 版本将 V3 规范推向生产可用，这是 Iceberg 的重大升级：

* **二进制删除向量（Deletion Vectors）**：用 Roaring Bitmap 替代 V2 的位置删除文件，行级删除性能提升一个数量级，高频 UPDATE/DELETE 场景查询速度显著提升
* **VARIANT 类型**：原生支持半结构化/JSON 数据，查询引擎可以直接对嵌套字段做谓词下推，不用再把 JSON 当字符串存
* **GEOMETRY/GEOGRAPHY 空间类型**：一等公民支持空间数据，可直接做空间连接
* **纳秒级时间戳**：满足高频金融和物联网场景的精度需求
* **行级血缘追踪（Row Lineage）**：每行数据都有身份标识和修改序列号，合规审计和 CDC 管道的好帮手
* **表级加密**：KMS 托管的密钥实现表级静态加密，数据、删除文件、清单文件全部加密
* **可插拔文件格式 API**：文件格式变为可插拔架构，为下一代存储格式打开大门

## 谁在用 Iceberg

Iceberg 的采用已经不分行业、不分规模了。以下是几个有具体数据的真实案例：

**Indeed —— 52PB 数据湖，查询成本降 43%-74%**

招聘平台 Indeed 运营着一个 52PB 的数据湖，支撑全公司的报表、分析和实验。他们将数据湖从 Hive-ORC 迁移到 Apache Iceberg，采用"写一次，随处读"策略。通过 Snowflake 直接读写 Iceberg 表，在测试环境中观察到查询成本比其他分析引擎**降低 43%-74%**。

**WHOOP —— AI 预测模型提速 3 倍，每天省 20 小时算力**

可穿戴设备公司 WHOOP 每天分析数十亿条生物特征信号。迁移到 Snowflake + Iceberg 架构后，AI/ML 财务预测模型运行速度**提升 3 倍**，每天节省 **20 小时**的计算时间。

**BMW Group —— 10000 用户，25% 成本节省**

宝马集团通过 Cloud Data Hub 管理制造、服务、供应链和可持续发展数据，覆盖 15 个业务域、6000+ 数据集、10000+ 月活用户。使用 Apache Iceberg + AWS + Snowflake 架构，在特定服务数据工作负载上实现 **25% 平均成本节省**，60+ 数据用例投入生产。

除了以上三家，**Netflix、Apple、Airbnb、LinkedIn** 都在用 Iceberg 管理 PB 级数据集。2026 年 Iceberg Summit 吸引了 600+ 参会者、70+ 场演讲，没有一场在讨论"要不要用"——全都在讨论"怎么用好"。

> 当一个技术峰会的议程里不再有"为什么要采用"的话题，说明它已经不是选项，而是基础设施了。

## 生态支持

Iceberg 的生态覆盖可能是所有表格式中最广的：

**计算引擎**：Apache Spark、Trino、Apache Flink、Presto、Apache Hive、Apache Impala

**云平台**：

* Snowflake —— Iceberg V3 已 GA，支持托管存储 + Polaris 目录
* Databricks —— Unity Catalog 托管 Iceberg 表已 GA，V3 已 GA
* AWS —— S3 Tables 原生支持 Iceberg，内置表维护
* Google Cloud —— BigQuery 支持 Iceberg 外部表
* Microsoft Azure —— 通过 Synapse 和 Fabric 支持

**多语言实现**：Java（主力）、Python、Rust、Go、C++，每个语言都有活跃的社区维护

## 初体验：Spark + Iceberg

用 Spark 快速体验 Iceberg 只需要几行代码。以下以 PySpark 为例：

```python
from pyspark.sql import SparkSession

# 创建支持 Iceberg 的 Spark 会话
spark = SparkSession.builder \
    .appName("iceberg-quickstart") \
    .config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
    .config("spark.sql.catalog.local", "org.apache.iceberg.spark.SparkCatalog") \
    .config("spark.sql.catalog.local.type", "hadoop") \
    .config("spark.sql.catalog.local.warehouse", "/tmp/iceberg-warehouse") \
    .getOrCreate()

# 创建 Iceberg 表
spark.sql("""
CREATE TABLE local.db.events (
    event_id STRING,
    event_time TIMESTAMP,
    user_id BIGINT,
    event_type STRING,
    payload VARIANT
) USING iceberg
TBLPROPERTIES ('format-version' = '3')
""")

# 写入数据
spark.sql("""
INSERT INTO local.db.events VALUES
('evt_001', TIMESTAMP '2026-08-07 10:00:00', 1001, 'click', '{"page": "home"}'),
('evt_002', TIMESTAMP '2026-08-07 10:05:00', 1002, 'purchase', '{"amount": 99.9}')
""")

# 查询
spark.sql("SELECT * FROM local.db.events").show()

# 时间旅行：查看历史快照
spark.sql("SELECT snapshot_id, committed_at FROM local.db.events.snapshots").show()
```

如果你想用 Docker 快速拉起一个环境，也可以直接用 Trino + Iceberg 的方案：

```bash
# 启动 Trino（内置 Iceberg 支持）
docker run -d --name trino -p 8080:8080 trinodb/trino:latest

# 进入 Trino CLI
docker exec -it trino trino

# 在 Trino 中创建 Iceberg 表
CREATE SCHEMA iceberg.db;
CREATE TABLE iceberg.db.events (
    event_id varchar,
    event_time timestamp(6),
    user_id bigint,
    event_type varchar
) WITH (format = 'PARQUET', format_version = 3);
```

## 进阶

Apache Iceberg 已经不只是"一个不错的选择"——它是 2026 年数据湖仓的事实标准。V3 规范的生产可用、全平台支持、多语言生态，让它从"值得尝试"变成了"默认选项"。

如果你正在做数据湖相关的工作，不管是迁移 Hive 表、搭建湖仓一体架构，还是给 AI 应用准备数据底座，Iceberg 都是绕不开的一环。

更多开源技术干货和学习资料，关注公众号「遇码」，领取专属福利。
