Iceberg 元数据的三层结构
Iceberg 表不用目录树表达分区,而是用三层元数据描述数据文件:metadata 文件记录表结构与快照列表,manifest list 记录某个快照包含哪些清单,manifest 文件记录数据文件及其分区统计。查询规划时先读这一串元数据,靠统计信息排除不可能命中的文件,再决定真正读哪些。
基本信息
| 第一层 | metadata 文件:表结构、快照列表、当前快照指针 |
|---|---|
| 第二层 | manifest list:一个快照对应的清单列表 |
| 第三层 | manifest:数据文件路径与分区、列级统计 |
| 收益 | 文件级裁剪,避免扫描全表 |
| 代价 | 小文件越多,元数据解析越慢 |
典型使用场景
- 排查数据问题:直接查 files 元数据表,确认某天分区到底有哪些文件
- 时间旅行:按快照读取历史版本的数据,用于复现与比对
- 定位小文件:按文件大小分布判断是否需要合并
- 评估分区健康度:按分区统计文件数与平均大小
- 审计变更:按快照列表追溯每次写入的时间与操作
查看快照与文件
查看快照与文件
-- 快照列表:每次提交产生一个快照
SELECT snapshot_id, committed_at, operation
FROM demo.db.trade_order.snapshots
ORDER BY committed_at DESC LIMIT 5;
-- 文件级明细:查看某天分区的数据文件
SELECT file_path, file_size_in_bytes, record_count
FROM demo.db.trade_order.files
WHERE partition.dt = DATE '2026-10-12';三层元数据读法
| 层级 | 内容 | 异常表现 |
|---|---|---|
| metadata | 表结构、快照、当前指针 | 指针指向错误快照会看到旧数据 |
| manifest list | 快照包含的清单 | 清单过多时规划耗时上升 |
| manifest | 文件路径与分区统计 | 统计缺失导致裁剪失效 |
| files 元数据表 | 文件级明细视图 | 小文件密集时行数巨大 |
什么时候需要合并
判断是否该做文件合并,看三个信号:单位分区的文件数量明显高于写入批次数,单个文件大小远低于目标值,以及查询规划阶段耗时占比上升。频繁的小批写入是主要原因,尤其是流式落表。合并动作按分区调度即可,不必整表重写。
元数据表(snapshots、files、manifests 这些)是排查问题的第一手材料:与其猜数据在哪,不如直接查文件清单,能省掉大量摸索时间。
频繁小批量写入会产生海量小文件,manifest 随之膨胀,规划查询逐步变慢;等到查询明显卡顿才开始治理,清理窗口会非常紧张。