題幹與適用場景
生產 Iceberg 表每日接收增量資料。團隊希望先在隔離分支寫入並完成品質檢查,再原子發布到生產,同時保留稽核點並清理舊快照。請設計 branch、tag、快照引用、並發提交、保留策略和回滾流程。核心考察表格式元資料與發布治理,歸為 data。
面試官考察點
- 區分可變 branch 與不可變 tag。
- 說明 snapshot reference、main 與目前快照關係。
- 設計 WAP 檢查、原子發布與並發衝突處理。
- 配置 branch/tag 保留,避免誤刪回滾資料。
- 證明讀者只看到一致快照。
回答前需要釐清的問題
- catalog、引擎和版本是否支援 branch、tag 與 WAP?
- 生產讀者是否固定讀取
main? - 品質檢查包含哪些表級、分割區級和跨表約束?
- 多個分支並行寫入時如何合併?
- 稽核點保留多久,誰清理孤兒檔案?
30 秒回答框架
「我會讓任務寫入獨立 branch,使用該分支快照執行檢查;通過後原子推進 main,並建立不可變 tag 作為稽核點。branch 和 tag 設定獨立保留期限,過期只刪除未被引用且符合條件的快照。發布前後比較 snapshot ID、行數、指標和讀取結果,衝突則重試或人工裁決。」
分步驟深入解答
第一步:建立引用模型
Iceberg 用 snapshot references 記錄 branch 與 tag。branch 可繼續提交,tag 指向固定快照,適合發布和稽核。生產 main 應有明確 owner,禁止直接修改 metadata。
第二步:設計 Write-Audit-Publish
寫入把新檔案提交到工作分支,不改變 main。稽核針對分支快照執行 schema、唯一性、範圍、行數和跨表檢查。通過後才推進生產引用並記錄報告。
第三步:處理並發提交
catalog 的樂觀並發檢查應拒絕過期更新。遇到衝突需重新讀取最新快照、合併並重跑檢查,不能直接覆蓋引用。
第四步:保證讀一致性
查詢開始時固定 snapshot ID 或引用版本。發布只變更 metadata 引用,資料檔案先完整寫入。未引用檔案要等安全窗口後再清理。
第五步:設定保留和稽核
tag 保留關鍵發布快照,branch 可設定數量和年齡。過期前先計算 main、branch、tag 的引用集合,不能只按時間刪除。
第六步:設計回滾
回滾把 main 指向已驗證舊 snapshot 或 tag,並產生新的 metadata 提交。回滾後重跑下游刷新,確認快取和物化視圖沒有使用壞版本。
第七步:定義驗收指標
記錄提交延遲、檢查通過率、發布成功率、衝突重試、引用數、清理量和回滾耗時。比較 snapshot、行數、聚合與下游結果。
高品質示範回答
「每日任務寫入獨立 branch,品質檢查固定該分支 snapshot。通過後原子推進 main,建立不可變 tag 作為稽核點。過期任務先排除所有仍被引用快照,再清理歷史和孤兒檔案。並發更新使用 catalog 檢查,衝突就重試而不覆蓋引用。查詢固定 snapshot,回滾透過舊 tag 產生新提交,並比較結果與恢復指標。」
常見錯誤
- 把 branch 當不可變點 → 它會繼續前進 → 用 tag 固定快照。
- 直接覆蓋 main → 繞過並發保護 → 透過 catalog 提交。
- 先刪舊快照再回滾 → 丟失稽核證據 → 保留 tag。
- 只按時間過期 → 誤刪引用資料 → 先算引用集合。
- 查詢不固定 snapshot → 看到混合版本 → 固定引用或 ID。
追問及應對
追問一:為什麼發布用 tag?
branch 會前進,tag 固定 snapshot,適合稽核和回滾。
追問二:兩分支寫同一分割區怎麼辦?
拒絕過期提交,重新基於最新祖先合併或人工裁決。
追問三:expiration 會刪回滾點嗎?
仍被 tag/branch 引用且符合保留策略的快照不應刪除。
追問四:如何防止半成品被讀?
生產只讀取 main 的原子快照,未發布分支不暴露給生產查詢。