题干与适用场景
你的数据湖使用 Iceberg 表,准备从 1.10.1 升级到 1.10.2。表包含 equality deletes、v2 deletes 和并发写入,且升级版本包含安全修复。请设计升级、验证、回滚和清理策略。
Apache Iceberg 官方记录 1.10.2 于 2026 年 5 月 18 日发布,包含 equality delete schema ordering、提交后快照加载、防止错误文件清理、并发格式升级校验,以及依赖安全修复。题目考察如何把版本说明转成数据正确性证据。
面试官考察点
- 能否区分表格式规范、引擎实现、Catalog、FileIO 和运行时依赖。
- 能否说明 equality deletes、position deletes、删除向量与快照可见性的关系。
- 能否设计影子验证、并发写入测试、文件清理保护和回滚窗口。
- 能否识别“依赖升级成功”不等于“历史查询正确”。
- 能否给出可审计指标、停止线和升级后清理条件。
需要澄清的问题
- 使用哪些引擎、Catalog、对象存储和 Iceberg runtime 版本?是否多语言写入?
- 表格式版本、删除文件类型、分区策略、快照保留和并发提交量是多少?
- 升级是否只替换客户端依赖,还是同时改变 writer、reader 和 catalog 服务?
- 是否存在不能暂停的流式写入与必须连续服务的下游查询?
版本与兼容矩阵
先锁定所有组件的实际依赖树和部署版本,建立 reader、writer、Catalog、FileIO、对象存储和清理作业的矩阵。1.10.2 的修复不能自动证明旧引擎理解新元数据;应以官方兼容说明和真实回放验证为准。把升级拆成只读 reader、离线 writer、在线 writer 和清理任务几个阶段。
在灰度环境复制生产快照、删除文件和并发提交,记录每个组件读取的 snapshot ID、manifest 数量、delete file 数量和表格式版本。任何未知兼容性都标记为阻断项,不用“看起来能读”作为放行证据。
删除语义与正确性验证
建立包含相同 equality key、多版本行、position delete、删除向量和并发更新的黄金数据集。用升级前后 reader 对同一 snapshot、时间旅行查询和增量读取做结果比对,检查行数、主键集合、聚合和 schema 顺序。对 delete application 记录被过滤行数和未匹配删除数。
验证不能只看最终表,因为错误删除可能在 compact 后才暴露。保留原始 manifest、delete file 和 snapshot 日志,并将结果与独立 SQL 或小型精确实现交叉核对。失败时保留快照,不立即 expire。
并发提交与快照保护
在升级期间运行 append、overwrite、row-level delete 和 compaction 并发测试,注入提交冲突、Catalog 超时和对象存储短暂 503。确认失败事务不会清理仍被活动快照引用的文件,成功提交后 reader 看到一致 snapshot。对 v2 deletes 与格式升级同时发生的场景设置专门停止线。
清理作业必须基于保留策略、活跃查询、分支或标签引用和提交时间计算候选文件;候选文件先进入延迟队列,再在第二次确认后删除。升级回滚窗口内禁止不可逆清理,避免把可读历史删掉。
部署、回滚与数据治理
采用分批发布:先只读服务,再低流量 writer,最后扩展到所有作业。每批记录错误率、snapshot 提交延迟、查询结果差异、delete miss、对象存储 404、清理候选量和资源开销。回滚优先切回兼容的客户端版本,并保留新提交产生的快照供审查;不要通过删除元数据“回滚”。
依赖安全修复要在构建产物中锁定并扫描传递依赖。若 1.10.2 移除或改变某个测试夹具或运行时 artifact,先在构建矩阵中验证打包、类路径和许可证,再进入生产。所有手工豁免写入审计记录并设过期日期。
失败演练与发布门槛
演练 equality delete schema 顺序变化、并发格式升级、快照加载失败、清理任务收到 503、旧 reader 读取新快照、对象存储延迟和恢复期间重复提交。发布门槛包括零不可解释结果差异、delete miss 在预算内、无活动快照文件被清理、回滚后历史查询可读和依赖扫描通过。
若差异只出现在排序,应确认是否为未定义顺序;若主键集合或删除可见性差异,立即停止扩展。升级完成后等待保留窗口和观测期结束,再逐步恢复清理,不得因磁盘压力跳过证据保存。
延伸追问与参考答案
为什么不能只做最新快照的行数对比?
它无法覆盖时间旅行、增量读取、删除文件应用和历史快照清理。至少要对黄金数据集比较多个 snapshot、主键集合、聚合和 delete miss。
如何证明回滚安全?
保留升级前后快照、停止不可逆清理,验证旧 reader 能读保留窗口内历史,并演练提交冲突和对象存储故障后的恢复。
依赖安全修复如何进入数据验证?
锁定传递依赖并扫描构建产物,同时运行类路径、许可证和 reader/writer 矩阵测试;安全扫描通过不代表删除语义已正确。