題幹與適用場景
湖倉工作從物件儲存讀取 Parquet。少量檔案在跨區域複製後出現頁資料損壞,現有流程只能在整檔失敗時重跑。請設計頁級 CRC 校驗方案,說明校驗範圍、壓縮順序、reader 相容、隔離損壞頁和驗收指標。題目適合資料工程、儲存格式與湖倉基礎設施職位,核心考察列式檔案完整性,歸為 data。
面試官考察點
- 區分頁級 CRC 與檔案級校驗,知道 CRC 欄位是可選的。
- 說清楚校驗物件與壓縮邊界,不把標頭和解壓結果混為一談。
- 設計舊 reader 忽略 CRC 時的相容與灰度策略。
- 發現壞頁後阻止靜默髒讀,分離隔離、重複與重寫。
- 用結果一致性、定位時間及額外 CPU/I/O 衡量收益。
回答前需要釐清的問題
- writer、reader 版本是否實作頁 CRC?
- 損壞發生在物件儲存、複製鏈路還是本地快取?
- 是否啟用壓縮、加密或頁索引?reader 能否定位 column chunk?
- 業務要求完整恢復,還是可接受重建分割區?
- 重試會不會把壞物件繼續放入快取?
30 秒回答框架
「我先依 Parquet format 規範確認頁 CRC 的讀寫支援,記錄檔案、row group、column chunk、頁類型與物件版本。校驗失敗立即隔離物件,保留定位資訊,不跳過回傳結果;透過副本或上游重寫恢復。舊 reader 忽略 CRC 仍可讀取,但不能視為完整性證明。灰度階段注入 data page、dictionary page 與複製截斷損壞,量測捕獲率、定位時間、重試成本與結果一致性。」
分步驟深入解答
第一步:確認規範邊界
Parquet 頁標頭含可選的 32 位元 CRC 欄位,可用於 data page、dictionary page 等頁型。先確認 writer 是否填入、reader 是否驗證;只改 writer 設定不能保證消費端會檢測。
第二步:處理壓縮與校驗順序
CRC 的位元組範圍以格式定義與實作為準。固定「寫入算什麼、讀取驗什麼」的版本矩陣,不能自行把解壓後值重新計算。壓縮解碼失敗與 CRC 不符要分開記錄。
第三步:設計故障隔離
校驗失敗讓檔案讀取失敗並進入隔離佇列,記錄 URI、版本、頁定位和錯誤類型。不可靜默跳過壞頁。先嘗試同版本副本,副本均壞則重寫分割區或重放上游。
第四步:相容舊 reader
舊 reader 可能忽略 CRC 欄位並回傳資料,所以「能讀」不等於「已驗證」。灰度時建立 reader 版本矩陣;關鍵工作使用嚴格驗證 reader,舊版本只標示能力不足。
第五步:結合加密與頁索引
頁加密、壓縮與 CRC 順序遵循目標實作。CRC 不是加密認證,頁索引也不能取代 payload 驗證。讀取路徑完成格式要求的完整性驗證後,才進行解碼與裁剪。
第六步:構造損壞注入測試
只翻轉一個 data page 位元組,再分別破壞 dictionary page、頁標頭、檔案尾端和複製版本。覆蓋壓縮編碼、null、空頁與大頁,檢查新舊 reader 差異。
第七步:定義可重複驗收
固定物件版本、並發與冷快取,對比 CRC 開關的 CPU、讀取位元組、p95、捕獲率與定位時間。未損壞資料結果須一致;損壞樣本須失敗並進入隔離佇列。
高品質示範回答
「我會先依 Parquet 規範和目標 reader 實作確認頁 CRC 的可選欄位、涵蓋頁型及確切位元組範圍。讀取先驗證 CRC,再解壓與解碼;壓縮錯誤與 CRC 錯誤分開統計。壞頁立即讓檔案失敗並隔離,按物件版本嘗試副本,不能跳過回傳部分結果。
舊 reader 可能忽略 CRC,因此灰度建立版本矩陣與能力標籤。用位元翻轉、頁標頭損壞、字典頁損壞和複製截斷測試,量測捕獲率、定位時間、CPU、讀取位元組、恢復率和結果雜湊,再決定是否擴大範圍。」
常見錯誤
- 把 CRC 當加密認證 → CRC 不能防篡改 → 需要時疊加加密認證。
- 只改 writer 不測 reader → 下游可能忽略欄位 → 建立版本矩陣。
- 跳過壞頁繼續回傳 → 產生靜默缺行 → 失敗並隔離。
- 無限重試同一物件 → 放大成本 → 固定版本並設重試上限。
- 只測整檔損壞 → 漏掉頁級邊界 → 做分層注入。
追問及應對
追問一:CRC 能防惡意竄改嗎?
不能。CRC 偵測隨機錯誤;防竄改要用加密認證、簽章或受信儲存校驗。
追問二:舊 reader 忽略 CRC 會破壞相容嗎?
通常不會改變可讀性,但無法提供完整性保證。關鍵工作應使用嚴格驗證版本。
追問三:可以只重讀壞頁嗎?
可嘗試範圍讀取或副本,但完整結果仍須驗證;否則要重寫檔案或重放上游。
追問四:為何記錄物件版本?
避免重試期間物件被覆蓋,讓錯誤與恢復都對應同一份位元組內容。
追問五:如何控制效能成本?
以真實頁大小和併發量測 CPU、吞吐與 p95,先在高風險分割區灰度。