題干與適用場景
一條批次作業需要回填過去 90 天的訂單維度,完成後發現轉換邏輯錯誤,期間仍有串流寫入。請設計定位錯誤快照、重現受影響查詢、隔離修復、處理提交衝突與保留策略。核心是表格式版本、資料血緣與可恢復運維,因此歸入 data。
面試官考察點
面試官希望聽到快照是中繼資料指標而非簡單檔案副本,時間旅行依賴保留期;也要說明並發提交、回滾影響、下游讀一致性、快照過期與孤兒檔案清理。只說「恢復到昨天」不足以證明安全。
回答前需要釐清的問題
- 表使用哪個 catalog、引擎與提交鎖,快照 ID 與時間戳如何稽核?
- 錯誤寫入影響哪些分割區、快照與下游派生表?
- 串流作業是否在錯誤回填期間提交,能否暫停或按快照重播?
- 業務需要整表回滾、按分割區修復,還是產出新表供驗證?
- 快照與資料檔案保留多久,清理任務是否可能刪除恢復所需檔案?
30 秒回答框架
「我先從表歷史與提交日誌確定錯誤回填產生的快照,使用該快照與前一快照做差異查詢,標出受影響分割區。先隔離正確輸入,按同一快照重跑驗證,再選擇按分割區重寫、產生修復快照或在確認沒有後續合法提交時回滾。回滾前檢查並發提交與下游讀者,回滾後重新發布派生表。快照過期與孤兒檔案清理延後到恢復窗口之後,並監控快照、檔案與資料品質指標。」
分步驟深入解答
先讀取表歷史、快照列表與提交摘要,記錄快照 ID、提交時間、作業執行 ID、分割區範圍與輸入版本。不要只按牆上時間猜測,因為並發提交可能交錯。將錯誤快照與父快照做中繼資料和資料檔案差異,結合作業日誌、品質告警與分割區統計界定影響面。
用時間旅行查詢重現錯誤前後的同一業務指標,抽樣核對原始事件與轉換規則。快照提供一致讀視圖,但不會自動保留無限歷史;查詢必須在快照過期前完成,必要時匯出驗證樣本或複製中繼資料引用。
若串流寫入仍在運行,優先暫停受影響分割區或建立隔離分支/暫存表。按錯誤快照讀取正確輸入,修復邏輯後寫入新快照,提交時檢查父快照仍是預期版本。提交衝突時重讀最新快照,不能強制覆蓋並發合法寫入。
整表回滾只適用於能證明回滾點之後沒有需要保留的合法提交,且所有讀者接受短暫回退。更常見是按受影響分割區重寫,或發布修復表並讓下游切換引用。回滾只是移動目前中繼資料指標,不會自動修復已物化到其他表的資料。
修復完成後重新執行唯一性、數量、金額、延遲與業務對帳驗證,並比較錯誤快照、修復快照與原始資料。下游派生表需按修復版本重算,記錄新快照與作業版本,確保重跑可重現。
保留策略必須覆蓋回填、人工複核、下游重算與稽核期限。過早 expire snapshots 可能讓時間旅行失敗;刪除快照後仍未引用的資料檔案才可在確認沒有讀者後清理。孤兒檔案清理也要避免刪除尚未提交或仍被並發作業引用的檔案。
生產監控包括快照年齡、提交衝突、回滾次數、孤兒檔案數量、快照過期失敗、分割區品質、下游重算延遲與對帳差異。把快照 ID 與作業執行、程式碼版本、輸入分割區寫入稽核表,故障時可從結果追溯到提交。
高品質示範回答
「我先保存表歷史、快照 ID 與作業執行 ID,確認錯誤回填產生哪個提交,並用父快照與錯誤快照的時間旅行查詢界定受影響分割區。串流寫入若仍在繼續,我會暫停衝突範圍或把修復寫入隔離表,提交時校驗父快照,衝突就重讀最新版本而不強制覆蓋。
若後續沒有必須保留的合法提交,可以回滾中繼資料指標;否則按分割區重寫並發布修復快照。回滾不會自動修復下游物化表,所以我會按修復快照重算下游,重新跑資料品質與對帳。快照過期、孤兒檔案清理延後到稽核窗口之後,所有快照 ID、程式碼版本與輸入範圍寫入稽核紀錄。」
常見錯誤
- 只按時間戳猜快照 → 並發提交可能交錯 → 使用歷史、父子關係與作業 ID。
- 把快照當資料檔案副本 → 回滾不一定修復下游表 → 盤點中繼資料指標與派生資料。
- 強制覆蓋最新快照 → 遺失並發合法寫入 → 使用父快照檢查與衝突重試。
- 立即清理舊快照 → 時間旅行與稽核失效 → 保留足夠恢復窗口。
- 只驗證抽樣行 → 聚合錯誤未被發現 → 同時做分割區、指標、唯一性與對帳檢查。
- 只回滾主表 → 下游仍保留錯誤結果 → 按修復版本重算派生表。
- 把孤兒檔案清理當作無風險 → 並發作業可能仍引用檔案 → 結合提交與讀者狀態清理。
- 不記錄程式碼與輸入版本 → 修復無法重現 → 稽核表關聯快照、作業與版本。
追問及應對
追問一:何時整表回滾優於分割區重寫?
只有確認回滾點之後沒有必須保留的合法提交,且讀者接受短暫回退時才整表回滾;否則分割區重寫或修復表更安全。
追問二:時間旅行為什麼會失敗?
目標快照可能已被過期策略刪除,或其資料檔案已被清理。保留策略必須覆蓋調查與重算窗口,並監控清理任務。
追問三:如何避免修復覆蓋串流新資料?
限定受影響分割區,暫停衝突寫入或使用隔離分支;提交時校驗父快照,衝突後基於最新版本重新計算。
追問四:回滾會撤銷已發送的下游事件嗎?
不會。它只改變表的目前中繼資料指標;已發送事件、物化表與外部副作用需要獨立補償或重算。
追問五:快照與完整資料備份有何不同?
快照通常是表中繼資料對檔案集合的版本視圖,依賴檔案保留;完整備份還要考慮跨儲存複製、目錄與 catalog 恢復,不能混為一談。
追問六:如何證明回填修復正確?
固定輸入快照與程式碼版本,重跑分割區並比較原始事件、業務指標、唯一性、金額與對帳結果;同時記錄修復快照供複核。
追問七:為什麼要關注提交衝突?
Iceberg 提交是基於父快照的並發更新。忽略衝突並強推可能遺失其他作業的合法提交;衝突應觸發重讀、重算或人工決策。