Apache Iceberg 元数据术语详解:Snapshot、Manifest List、Manifest File 与 Snapshot Log
数据湖湖仓一体大数据【免费下载链接】icebergApache Iceberg项目地址https://gitcode.com/gh_mirrors/iceberg5/iceberg点击查看免费下载本文基于 Apache Iceberg 官方术语表site/docs/terms.md逐一解释 Iceberg 元数据体系中的六个核心概念Snapshot快照、Manifest list清单列表、Manifest file清单文件、Partition spec分区规范、Partition tuple分区元组与Snapshot log快照日志并对照格式规范 format/spec.md 与 Java 参考实现源码说明这些概念在表元数据 JSON 和 manifest 文件中的具体存储位置与作用机制。读完本文后你将能够看懂 Iceberg 元数据层级的完整结构理解 scan planning扫描规划如何利用这些元数据做文件裁剪并能在表元数据 JSON 中定位每个术语对应的字段。上图为 Iceberg 的元数据层级结构源自 site/docs/assets/images/iceberg-metadata.pngCatalog 中的表条目持有指向当前 metadata file 的指针metadata file 中内嵌所有有效快照s0、s1每个快照指向一个 manifest listmanifest list 再指向若干 manifest filemanifest file 最终列出快照中包含的全部数据文件。本文的六个术语恰好覆盖了这条链路上每一层的关键角色。Snapshot某一时刻的表状态官方定义一个 snapshot快照是表在某个时刻的状态。每个快照列出构成该时刻表内容的全部数据文件这些数据文件分布在多个 manifest file 中而某个快照的全部 manifest 则被记录在一个唯一的 manifest list 文件中。规范对快照字段的完整定义见 format/spec.md 的### Snapshots章节版本字段说明v1/v2 必填snapshot-id唯一 long ID可选parent-snapshot-id父快照 ID无父快照时省略v2 必填sequence-number单调递增的 long标记表变更顺序v1/v2 必填timestamp-ms快照创建时间戳用于垃圾回收与表检查v2 必填manifest-list该快照的 manifest list 位置v1 中可选存在时manifests必须省略v1 可选manifestsmanifest 文件位置列表v2 已由 manifest-list 取代v2 必填summary字符串 map总结快照变更必含operation字段可选schema-id快照创建时表的当前 schema IDsummary中的operation字段取值为append仅新增数据文件、replace增删文件但表数据逻辑不变如 compaction、格式转换、overwrite逻辑覆盖、delete删除数据快照过期等操作会依据该字段跳过特定快照。在 Java 参考实现中快照由接口 api/src/main/java/org/apache/iceberg/Snapshot.java 描述关键访问器与上表一一对应sequenceNumber()、snapshotId()、parentId()、timestampMillis()、summary()、manifestListLocation()。可以确认manifestListLocation()正是术语表中快照的 manifests 列在单一 manifest list 文件中这一说法在代码层面的落点——v2 表读取快照时即从此位置出发读取 manifest 清单。规范还解释了为什么一个快照的数据文件可以存放在多个 manifest 中快速追加fast append追加数据时只需写入一个全新 manifest而不是改写已有 manifest最小化写入量多分区规范共存一个 manifest 只对应单一 partition spec表的分区配置演化后旧文件留在旧 manifest、新文件写入新 manifest而查询无需变化因为分区过滤器始终由数据列谓词推导并行规划大表拆分到多个 manifest实现可以并行规划作业、降低单个 manifest 重写成本。Manifest list快照的 manifest 索引官方定义manifest list 是列出构成某个表快照的所有 manifest 的元数据文件。清单列表中的每个 manifest 都附带描述其内容的信息如分区值范围用于加速元数据操作。规范#### Manifest Lists章节补充了关键机制每次提交快照的尝试都会写一份新的 manifest list因为产生新快照时 manifest 列表必然变化写入时清单中所有新 manifest 会记录该快照的乐观序号。此外manifest list 携带概要元数据可在规划表扫描时避免读取快照内的全部 manifest——包括新增/保留/删除的文件数以及写入该 manifest 所用的每个分区字段的取值概要field_summarycontains_null、contains_nan、lower_bound、upper_bound。docs/docs/performance.md 的 Metadata filtering 一节从使用角度印证了这一点manifest list 充当 manifest 文件的索引Iceberg 先用清单中记录的分区值范围过滤 manifest再读取被选中的 manifest 获取数据文件这使得单节点规划多 PB 级大表成为可能。Manifest file快照数据文件的清单官方定义manifest file 是列出构成快照的一子集数据文件的元数据文件。清单中的每个数据文件都随附一个 partition tuple分区元组、列级统计信息以及用于在 scan planning 中裁剪 split 的概要信息。规范### Manifests章节给出了完整细节值得完整了解manifest 是不可变的 Avro 文件本身是合法的 Iceberg 数据文件使用合法的 Iceberg 格式、schema 和列投影一个 manifest 只存放数据文件或只存放删除文件二者不能混放因为含删除文件的 manifest 在作业规划时会被优先扫描content属性记录data或deletes一个 manifest 只对应单一 partition specspec 变更时旧文件保留在旧 manifest新文件写入新 manifest——因为 manifest 文件的 schema 由分区 spec 决定manifest 的 Avro key-value metadata 中必须写入schema/schema-id、partition-spec/partition-spec-id、format-versionv2 还必填content。manifest_entry与data_file的核心字段节选自规范字段表字段类型说明0 statusint0: EXISTING、1: ADDED、2: DELETED跟踪文件增删1 snapshot_idlong文件被加入或删除的快照 IDnull 时从 manifest list 继承3 sequence_number/4 file_sequence_numberv2long数据序号 / 文件序号用于规划删除文件适用于哪些数据文件2 data_filestruct文件路径、partition tuple、指标metrics等data_file中的列级统计column_sizes、value_counts、null_value_counts、nan_value_counts、distinct_counts、lower_bounds、upper_bounds正是术语表中列级统计的具体所指它们支持在规划阶段按列过滤文件split_offsets如 Parquet 的所有 row group 偏移则直接服务于 split 裁剪。规范#### Scan Planning描述了规划流程先按 manifest 中的分区值范围与文件计数跳过无匹配文件的 manifest再把扫描谓词通过**包含式投影inclusive projection**转换为分区谓词结合列级上下界选出实际要读的文件——docs/docs/performance.md 的 Data filtering 一节以同样的口径描述了这条链路。Partition spec如何对数据分区官方定义partition spec 描述表中的数据如何分区。一个 spec 由源列 转换transform的列表组成transform 从源值生成分区值——例如date(ts)从名为ts的时间戳列生成日期分区值。规范### Partitioning章节说明每个分区字段由四部分组成源列 ID、分区字段 ID在 spec 内唯一v2 表元数据中全局唯一、transform、分区名。transform 支持identity、bucket[N]Murmur3 x86 32 位哈希取模、truncate[W]、year/month/day/hour、void且所有 transform 对 null 输入必须返回 null。规范中一段关键表述解释了 spec 的设计意图分区 spec 捕获从表数据到分区值的转换这既用于转换数据值也用于把列谓词转换为分区谓词从而将逻辑查询与物理存储解耦——分区布局可以随数据量变化而演化正确的分区过滤器始终从列谓词推导得出用户无需同时提供逻辑谓词和分区谓词。docs/docs/partitioning.md 的 Icebergs hidden partitioning 一节正是这一思想的展开Iceberg 负责把event_time转成分区值如date(event_time)生产者与消费者都不需要看见显式的分区列工作查询不再绑定表的物理布局。在源码中分区规范由 api/src/main/java/org/apache/iceberg/PartitionSpec.java 建模specId()返回规范 ID与 manifest list 中partition_spec_id字段规范要求该 ID 必须列于表元数据的partition-specs中对应。Partition tuple随每个数据文件存储的分区值官方定义partition tuple分区元组是随每个数据文件存储的分区数据元组tuple/struct。数据文件中所有行的分区元组取值相同元组由分区 spec 对行数据转换而来。术语表还特别对比Iceberg 原样unmodified存储分区值不像 Hive 表那样在文件系统路径与键之间来回做字符串转换。规范### Partitioning开头一段明确了其用途数据文件在 manifest 中随一个分区值 tuple 存储扫描时用它过滤不可能包含匹配记录的文件同一 manifest 中数据文件可来自任意分区只要分区 spec 相同。同时规范指出partitionstruct 的 schema 由写入该 manifest 的分区 spec 推导v2 中 partition struct 的字段 ID 必须与分区 spec 的分区字段 ID 一致——这解释了为什么分区演化时必须复用既有字段 ID分区字段 ID 会作为 manifest 文件中 partition tuple 的字段 ID 被持久化。docs/docs/partitioning.md 的 Problems with Hive partitioning 一节列出了 Hive 式显式分区的三类问题写入方需手工给出分区值且无法校验、查询必须手写额外过滤、查询与物理布局耦合而术语表中Iceberg 原样存储分区值这一句正是对上述问题的回应值不做字符串化转换也就不存在2018-12-01与20181201这类静默错误的格式陷阱。在 Java 实现中分区元组由 core/src/main/java/org/apache/iceberg/PartitionData.java 承载即 manifest 条目中102 partition字段的运行时表示。Snapshot log当前快照的历史日志官方定义snapshot loghistory table是记录表当前快照如何随时间变化的元数据日志内容是一组时间戳 快照 ID对当前快照在何时变更、变更成了哪个快照 ID。它作为snapshot-log字段存储在表元数据中规范位置见 format/spec.md 的### Table Metadata and Snapshots章节。表元数据 JSON 中相关字段长这样节选自规范附录 Ccurrent-snapshot-id: 3051729675574597004, snapshots: [ { snapshot-id: 3051729675574597004, timestamp-ms: 1515100955770, summary: { operation: append }, manifest-list: s3://b/wh/.../s1.avro, schema-id: 0 } ], snapshot-log: [ { snapshot-id: 3051729675574597004, timestamp-ms: 1515100955770 } ]注意规范中一句关键说明Snapshots are not serialized separately. Instead, they are stored in the table metadata JSON.——快照不是独立文件而是直接内嵌在表元数据 JSON 中snapshot-log只是当前快照main 分支变更历史的精简日志与完整快照列表snapshots并存。参考实现中这组概念的落点非常集中core/src/main/java/org/apache/iceberg/TableMetadata.java 持有private final ListHistoryEntry snapshotLog字段snapshotLog()方法对外暴露日志条目类型是 api/src/main/java/org/apache/iceberg/HistoryEntry.java 接口仅两个方法timestampMillis()变更时间戳与snapshotId()变更后的当前快照 ID与术语表时间戳和 ID 的对定义完全一致TableMetadata内部 Builder 中setRef针对main分支时会执行currentSnapshotId ref.snapshotId()并向snapshotLog追加一条SnapshotLogEntry反之removeRef(main)时snapshotLog.clear()——即日志只随 main 分支当前快照推进这与当前快照如何随时间变化的语义吻合JSON 序列化侧core/src/main/java/org/apache/iceberg/TableMetadataParser.java 定义了常量SNAPSHOT_LOG snapshot-log读写表元数据 JSON 时遍历metadata.snapshotLog()序列化为上述条目列表。小结六个术语在元数据链路中的位置术语存储位置核心作用Snapshot表元数据 JSON 的snapshots列表表在某一时刻的完整状态指向一个 manifest listManifest list快照manifest-list指向的 Avro 文件manifest 的索引携带分区值范围与文件计数加速规划Manifest filemanifest list 列出的 Avro 文件列出快照的一部分数据/删除文件及其分区元组、列级统计Partition spec表元数据 JSON 的partition-specs定义源列 transform驱动分区谓词推导支持演化Partition tuplemanifest 中每个 data file 的partition字段文件内所有行共享的分区值原样存储用于扫描过滤Snapshot log表元数据 JSON 的snapshot-log当前快照的 (timestamp-ms, snapshot-id) 变更历史这些概念共同构成了 Iceberg 单节点快速规划的基础从元数据指针出发经 manifest list 的范围概要跳过无用的 manifest再经 manifest 中的分区元组与列级统计裁剪数据文件。进一步的字段级细节含 v1/v2 差异、序列号继承规则可继续查阅 format/spec.md 的### Manifests、### Snapshots、### Table Metadata and Snapshots章节以及 docs/docs/performance.md 对 scan planning 过程的完整描述。赞分享数据湖湖仓一体大数据【免费下载链接】icebergApache Iceberg项目地址https://gitcode.com/gh_mirrors/iceberg5/iceberg点击查看免费下载相关推荐Apache Iceberg 核心术语完全指南Catalog、Snapshot 与 Manifest 元数据体系解析Apache Iceberg 核心术语完全指南Catalog、Snapshot 与 Manifest 元数据体系解析 本文是 Apache Iceberg 官数据湖大数据数据存储Apache Iceberg 核心术语全解读从 Snapshot 到 Snapshot Log 的元数据体系Apache Iceberg 核心术语全解读从 Snapshot 到 Snapshot Log 的元数据体系 导读 本篇文章以 Apache Iceberg大数据数据湖OLAP数据存储Docker CLI manifest inspect 命令详解查看镜像 Manifest 与多架构 Manifest ListDocker CLI manifest inspect 命令详解查看镜像 Manifest 与多架构 Manifest List 导读 docker maniCLI开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Codex 长任务中断后怎样不重复?把会话状态快照写成可恢复清单

Codex 长任务中断后怎样不重复?把会话状态快照写成可恢复清单

Codex 长任务中断后怎样不重复?把会话状态快照写成可恢复清单 本文围绕“会话状态快照”设计一个可离线复核的教学场景:不调用在线模型、不连接设备、不上传业务数据。核验日期为 2026-10-14。 一、先定义本题真正要避免的错误 长任务中断后只凭自然语言总结继续,常会忘记哪…

2026/10/14 21:57:06 阅读更多 →
Stanza自然语言处理工具实测:从中文分词到依存句法分析与部署

Stanza自然语言处理工具实测:从中文分词到依存句法分析与部署

这几天我抽空把某顶尖高校NLP团队开源的Python自然语言处理工具Stanza完整试用了一遍,从安装、跑通中文分词到做精度对比,算是把它的底细摸了个大概。这个工具最近在NLP社区里讨论度不低,主要是因为它和传统的分词库走的是完全不同的路线——…

2026/10/14 21:57:06 阅读更多 →
红绿灯检测实战:PaddleDetection+SSD_MobileNet与VOC数据集方案解析

红绿灯检测实战:PaddleDetection+SSD_MobileNet与VOC数据集方案解析

做红绿灯检测这个项目,我前前后后折腾了差不多两周,从数据标注到模型训练,再到最后的边缘端部署,踩了不少坑。标题里写的这套东西——PaddleDetection、SSD_MobileNet、VOC数据集——组合起来看确实是个经典得不能再经典的轻量级目…

2026/10/14 21:57:06 阅读更多 →

最新新闻

一种可快速恢复的Zabbix高可用架构设计

一种可快速恢复的Zabbix高可用架构设计

做运维的朋友们可能都有过这样的深夜惊魂:好容器完成了监控的Server、Proxy的部署、告警的收敛,监控的覆盖率也达标了,结果承载Zabbix Server和PostgreSQL的机器突然宕机。那一刻,不是“少看几张图”的问题,而是整个团…

2026/10/15 4:01:45 阅读更多 →
2026网站创建用什么ai建站系统?科技赋能才能事半功倍!

2026网站创建用什么ai建站系统?科技赋能才能事半功倍!

2026网站创建用什么AI建站系统?科技赋能才能事半功倍!中国信通院2026年初发布的《中小企业数字化发展白皮书》显示,国内超六成中小企业将“低成本快速搭建线上阵地”列为数字化转型首要需求,AI建站系统凭借低门槛、高效率、全链路…

2026/10/15 4:01:45 阅读更多 →
做了这么久技术博主,我从后台私信里看透了这几种人

做了这么久技术博主,我从后台私信里看透了这几种人

做技术专栏这么久,后台私信几千条,我现在是分情况处理的——但一开始不是。 刚开号那会儿我每条都回。有人问问题,我认认真真写解答;有人要加微信,我不好意思拒绝;有人半夜甩过来一整段代码让帮忙看&#x…

2026/10/15 4:01:45 阅读更多 →
从零开始用Canvas开发五子棋网页游戏:技术选型、AI博弈与实战解析

从零开始用Canvas开发五子棋网页游戏:技术选型、AI博弈与实战解析

1. 项目设计与技术选型思路1.1 这个项目到底在做什么五子棋网页版小游戏,是前端练手项目里出现频率极高的一种。它看起来简单,但如果把完整需求列出来,会发现麻雀虽小五脏俱全:棋盘渲染、落子交互、胜负判定、悔棋、重置、人机对战…

2026/10/15 4:01:45 阅读更多 →
Superpowers:基于浏览器的开源协作游戏开发平台

Superpowers:基于浏览器的开源协作游戏开发平台

最近好几个做独立游戏的朋友都在问同一个词:superpowers。我一开始以为他们说的是某款超能力题材的新游戏,直到有位朋友发来一张浏览器截图,我才反应过来——他们问的是开源协作游戏开发工具 Superpowers,一个真正能让你不装全家桶…

2026/10/15 4:01:45 阅读更多 →
2026大厂AI薪资大起底:普通研发卷到40万,Agent开发狂撒80万年薪?

2026大厂AI薪资大起底:普通研发卷到40万,Agent开发狂撒80万年薪?

2026年大厂AI薪资揭秘:普通研发岗薪资锚定40万左右,但竞争激烈;AI Agent开发岗(50-80K15薪)对标SSP,高薪且门槛低,企业抢“应用落地”人才;顶级AI科学家包揽80-220万年薪。求职建议分…

2026/10/15 4:00:45 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →