設計回填與重播 是做什麼的?
使用時機
- 為新模型 / 管線載入歷史資料。
- 修復轉換錯誤後重新處理過去的時間區間。
- 重播事件或從原始資料重新衍生資料表。
- 不要用於一般增量執行(請改用
building-dbt-models/authoring-airflow-dags)。
為何需要謹慎處理
回填是資料工程中最危險的常規操作:它會改寫歷史紀錄。執行不當會造成重複計數、改變昨天的數字,或使正式環境超載。正確執行時,它則是無趣且可重複的。先決條件是冪等性(請參閱 writing-idempotent-transformations)。
工作流程
- [ ] 回填前確認轉換為冪等(重複執行 == 執行一次)
- [ ] 定義精確的時間區間與分割區粒度
- [ ] 試運行一個分割區;比對計數 / 總和與來源是否一致
- [ ] 逐區執行(限制並行度),而非一次全部執行
- [ ] 隔離回填運算與正式環境的工作負載
- [ ] 驗證總數並核對;然後恢復正常排程
- 先證明冪等性。 如果重新執行一個時間區間會改變結果,請先修正此問題再觸碰歷史紀錄。對非冪等作業進行回填會使資料倍增。
- 精確界定範圍。 明確的開始 / 結束時間以及分割區單位(天 / 小時 / 地區)。
- 試運行一個分割區 並與來源比對,再進行大規模執行。
- 分批執行。 以有限批次處理分割區,以便監控、暫停與恢復 — 絕不執行一個巨大的無邊界作業。
- 隔離運算資源。 使用獨立的資料倉儲 / 叢集 / 資源池,避免回填影響正式環境的 SLA。
- 驗證 + 恢復。 核對回填範圍內的總數,然後交還給正常的排程。
模式
冪等逐分割區回填 — 每個分割區的覆蓋都是獨立的,且可安全重試:
# 限制並行度,一次一天;每一天覆蓋自己的分割區。
for day in $(seq_dates 2026-01-01 2026-01-31); do
run_transform --run-date "$day" # 僅對該天執行 delete-insert / MERGE
done
Airflow — catchup / backfill 重新執行時間區間;僅在任務為冪等且以資料區間為參數時才安全。dbt — 將增量模型過濾至目標時間區間,或對有限區間執行 --full-refresh。
隔離 + 流量管制 — 使用專用資料倉儲 / 叢集,並設定並行上限,避免回填影響即時儀表板。
常見陷阱
- 對非冪等作業進行回填 — 造成重複或總數變動;請先使其具備冪等性。
- 一次執行巨大的無邊界作業 — 無法監控或恢復,且會使正式環境超載;請逐分割區執行。
- 共用正式環境運算資源 — 回填會造成負載高峰而破壞 SLA;請隔離。
- 未進行驗證 — 預設成功卻不核對範圍內的計數 / 總和。
- 回填中途變更邏輯 — 造成歷史不一致;請鎖定整個執行過程的程式碼版本。
- 忽略下游相依 — 回填基礎資料表卻未重新整理相依的資料超市 / 彙總,會導致它們不一致。