题干与适用场景
一条批处理作业需要回填过去 90 天的订单维度,作业完成后发现转换逻辑错误。期间仍有流式写入。请设计定位错误快照、重现受影响查询、隔离修复、提交冲突处理和保留策略。核心考察表格式版本、数据血缘和可恢复运维,因此归入 data。
面试官考察点
面试官希望听到快照是元数据指针而非简单文件副本,时间旅行依赖保留期;还要说明并发提交、回滚影响、下游读一致性、快照过期与孤儿文件清理。只说“恢复到昨天”不足以证明安全。
回答前需要澄清的问题
- 表使用哪个 catalog、引擎和提交锁,快照 ID 与时间戳如何审计?
- 错误写入影响哪些分区、快照和下游派生表?
- 流式作业是否在错误回填期间提交,能否暂停或按快照重放?
- 业务需要整表回滚、按分区修复,还是产出新表供校验?
- 快照和数据文件保留多久,清理任务是否可能删除恢复所需文件?
30 秒回答框架
“我先从表历史和提交日志确定错误回填产生的快照,使用该快照与前一快照做差异查询,标出受影响分区。先复制或隔离正确输入,按同一快照重跑校验,再选择按分区重写、生成修复快照或在确认没有后续合法提交时回滚。回滚前检查并发提交和下游读者,回滚后重新发布派生表。快照过期与孤儿文件清理必须延后到恢复窗口之后,并监控快照、文件和数据质量指标。”
分步骤深入解答
先读取表历史、快照列表和提交摘要,记录快照 ID、提交时间、作业运行 ID、分区范围与输入版本。不要只按墙上时间猜测,因为并发提交可能交错。将错误快照与其父快照做元数据和数据文件差异,结合作业日志、质量告警和分区统计界定影响面。
用时间旅行查询复现错误前后的同一业务指标,抽样核对原始事件和转换规则。快照提供一致的读视图,但并不自动保留无限历史;查询必须在快照过期前完成,必要时导出校验样本或复制元数据引用。
若流式写入仍在运行,优先暂停受影响分区或建立隔离分支/临时表。按错误快照读取正确输入,修复逻辑后写入新快照,并在提交时检查父快照仍是预期版本。提交冲突时重新读取最新快照,不能强制覆盖并发合法写入。
整表回滚只适用于能证明回滚点之后没有需要保留的合法提交,且所有读者接受短暂回退。更常见的做法是按受影响分区重写,或者发布一张修复表并让下游切换引用。回滚只是移动当前元数据指针,不会自动修复已经物化到其他表的数据。
修复完成后重新运行唯一性、数量、金额、延迟和业务对账校验,并比较错误快照、修复快照和原始数据。下游派生表需要按修复版本重算,记录新快照与作业版本,确保重跑可复现。
保留策略必须覆盖回填、人工复核、下游重算和审计期限。过早 expire snapshots 可能让时间旅行失败;删除快照后仍未引用的数据文件才可在确认没有读者后清理。孤儿文件清理也要避免删除尚未提交或仍被并发作业引用的文件。
生产监控包括快照年龄、提交冲突、回滚次数、孤儿文件数量、快照过期失败、分区质量、下游重算延迟和对账差异。把快照 ID 与作业运行、代码版本、输入分区写入审计表,故障时能从结果追溯到提交。
高质量示范回答
“我先保存表历史、快照 ID 与作业运行 ID,确认错误回填产生了哪个提交,并用父快照和错误快照的时间旅行查询界定受影响分区。流式写入若仍在继续,我会暂停冲突范围或将修复写入隔离表,提交时校验父快照,冲突就重读最新版本而不强制覆盖。
如果后续没有必须保留的合法提交,可以回滚元数据指针;否则按分区重写并发布修复快照。回滚不会自动修复下游物化表,所以我会按修复快照重算下游,重新跑数据质量和对账。快照过期、孤儿文件清理延后到审计窗口之后,所有快照 ID、代码版本和输入范围写入审计记录。”
常见错误
- 只按时间戳猜快照 → 并发提交可能交错 → 使用历史、父子关系和作业 ID。
- 把快照当数据文件副本 → 回滚不一定修复下游表 → 盘点元数据指针和派生数据。
- 强制覆盖最新快照 → 丢失并发合法写入 → 使用父快照检查和冲突重试。
- 立即清理旧快照 → 时间旅行和审计失效 → 保留足够恢复窗口。
- 只验证抽样行 → 聚合错误未被发现 → 同时做分区、指标、唯一性和对账检查。
- 只回滚主表 → 下游仍保留错误结果 → 按修复版本重算派生表。
- 把孤儿文件清理当作无风险 → 并发作业可能仍引用文件 → 结合提交和读者状态清理。
- 不记录代码和输入版本 → 修复无法复现 → 审计表关联快照、作业和版本。
追问及应对
追问一:什么时候整表回滚优于分区重写?
只有确认回滚点之后没有必须保留的合法提交,且读者接受短暂回退时才整表回滚;否则分区重写或修复表更安全。
追问二:时间旅行为什么会失败?
目标快照可能已被过期策略删除,或其数据文件已被清理。保留策略必须覆盖调查和重算窗口,并监控清理任务。
追问三:如何避免修复覆盖流式新数据?
限定受影响分区,暂停冲突写入或使用隔离分支;提交时校验父快照,冲突后基于最新版本重新计算。
追问四:回滚会撤销已经发送的下游事件吗?
不会。它只改变表的当前元数据指针;已发送事件、物化表和外部副作用需要独立补偿或重算。
追问五:快照与完整数据备份有什么区别?
快照通常是表元数据对文件集合的版本视图,依赖文件保留;完整备份还要考虑跨存储复制、目录和 catalog 恢复,不能混为一谈。
追问六:如何证明回填修复正确?
固定输入快照和代码版本,重跑分区并比较原始事件、业务指标、唯一性、金额和对账结果;同时记录修复快照供复核。
追问七:为什么要关注提交冲突?
Iceberg 的提交是基于父快照的并发更新。忽略冲突并强推可能丢失其他作业的合法提交;冲突应触发重读、重算或人工决策。