建立資料攝取管線 是做什麼的?
使用時機
- 從資料庫、API、檔案或 SaaS 擷取資料至資料倉儲/資料湖。
- 設計增量擷取、水位線或 CDC。
- 處理 API 分頁、速率限制與重試。
- 決定使用受管 EL(Fivetran/Airbyte)或自訂程式碼。
- 不要用於轉換已落地資料(請使用 dbt/Spark 相關技能)。
工作流程
- [ ] 決定擷取模式:完整快照 vs 增量 vs CDC
- [ ] 挑選可靠的高水位標記(updated_at、LSN/binlog、序號)
- [ ] 以不可變方式存放原始資料(附加),後續再進行轉換
- [ ] 使載入成為冪等操作(透過主鍵進行 upsert 或分割區覆寫)
- [ ] 處理分頁、速率限制、重試與延遲資料
- 選擇模式。 完整重新載入(小型/維度表)、基於高水位標記的增量(大多數事實表),或 CDC(需要捕捉刪除與每次變更的高交易量 OLTP)。
- 挑選可信賴的水位標記。 僅在來源始終更新
updated_at時才能使用;否則使用資料庫日誌位置(LSN/binlog/SCN)或單調遞增序列。儲存最後的水位標記並從該處繼續。 - 以不可變方式存放原始資料。 附加存放原始擷取資料(銅層)並附加載入中繼資料;在下游進行轉換,以便無需重新擷取來源即可重播。
- 冪等載入。 透過自然主鍵進行 upsert 或覆寫分割區,使重試與重疊不會造成重複(參見
writing-idempotent-transformations)。 - 穩健處理分頁、速率限制與延遲資料。
模式
為延遲資料加入重疊窗口的增量擷取:
-- 拉取超過最後水位標記的小型重疊窗口以捕捉延遲更新,
-- 然後透過主鍵進行 upsert,使重疊不會產生重複。
SELECT * FROM source.orders
WHERE updated_at >= :last_watermark - INTERVAL '3 days';
CDC — 讀取資料庫日誌(Debezium/原生方式)以捕捉插入、更新和刪除(水位標記式擷取會遺漏這些)。使用 MERGE 套用變更,並使用變更的提交位置進行排序。
API 分頁 + 速率限制 — 跟隨 cursor/next-page 令牌;在收到 429/5xx 時以指數退避和抖動進行等待與重試;對進度設置檢查點,以便失敗時能從中斷處恢復。
受管 vs 自訂 — 對標準連接器使用 Fivetran/Airbyte(它們能處理結構演變、增量狀態、重試);僅對特殊來源或嚴格控制/成本需求才撰寫自訂程式碼。
常見陷阱
- 當來源未可靠設定
updated_at時使用它作為水位標記 — 會默默遺漏資料列;請驗證或改用日誌式 CDC。 - 沒有重疊窗口 — 兩次執行之間延遲到達的更新會遺失。
- 基於水位標記的擷取期望捕捉刪除 — 它無法看到刪除;請使用 CDC 或定期完整比對。
- 在擷取期間進行轉換 — 使重播變得不可能;請先存放原始資料。
- 忽略速率限制/分頁邊界情況 — 導致看似完整的部分擷取;請設置檢查點並驗證筆數。
- 非冪等載入 — 重試與重疊窗口會造成重複資料列。