认识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 为例:
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 的方案:
# 启动 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 都是绕不开的一环。
更多开源技术干货和学习资料,关注公众号「遇码」,领取专属福利。
