[Data] Data Pipeline 101(五) — 冪等性
Published in
3 min readApr 4, 2020
idempotence 真的很難翻譯內
在設計管線系統以及 ETL Job 時,需意要特別注意資料的 Idempotence(冪等性,Sorry 我真的想不到其他適合的字詞來翻譯)。
定義
Idempotence 在Wiki 的定義在此https://zh.wikipedia.org/wiki/%E5%86%AA%E7%AD%89。
完全看不懂是正常的 lol,簡單的來說,就是「反覆執行同樣的 ETL 排程,會得到一樣的結果。」
例如現在有一隻 ETL 排程每天早上的 8:00 會計算前一天營業額,這個排程在 4/1 號執行時,會讀取 3/31 號的資料,計算結果並寫入到結果表中。如果 4/2 號重新執行 4/1 的排程時,也能得到一模一樣的結果。我們希望這隻程式是 reliable(可信賴的) 的。
通常一般的程式只蘊含業務邏輯,但是 ETL 程式除了業務邏輯外,還包括了資料。所以要達到冪等性必有兩個前提:
- ETL 程式必須能夠被重複執行
- ETL 程式所需要的資料必須被保留
能夠被重複執行的 ETL
要讓 ETL 程式能夠重複被執行需要考量的面相很多,像是:
- 是不是能重跑任一時間點的資料?
例如今天 4/5 號,我是不是能夠讓程式去執行 4/1、3/31、甚至過去半年的 ETL 排程,而能得到一樣的結果?這邊最基本的做法就是在寫 SQL 的時候把時間單位當成變數。 - 是不是需要考量冷啟動的狀態?
像是所使用的目標表或中介表的 Create Table 指令有沒有被包含在 ETL 排程中?還是需要先在其他地方建立目標表才能執行。當目標表被刪除時(或尚未建立時),ETL 程式能不能照常執行。 - 避免塞入重複資料。
程式要能被重複執行還能得到相同結果的話,表示目標表格就不能單純使用 Append 的方式來新增資料。通常如果是摘要型的表格,就會使用 Update 的方式來確保 Key 值不會重複,例如每天的使用者人數,每次寫入時就直接根據日期做 Update/ Insert。但如果目標表格不支援 Update 時(例如 Hive),我們就會直接以 Drop Partition 的方式來避免塞入重複資料。
ETL 程式所需要的資料
呈上,ETL 除了業務邏輯外,還需要一樣的資料才能跑出一樣的結果。所以每份原始資料都需要被保留下來。而且必須確保 ETL 能用同樣的方式找到原始資料。
為了避免過多的原始資料造成儲存空間費用的增加或浪費。通常會設定資料的 Life Cycle。
- 剛進來的原始資料都放在熱區供 ETL 使用
- 會透過一個或幾個 ETL 整理出時間粒度較粗、維度非常多的大表。
- 其他 ETL 會再根據上面這幾個大表產生後續比較特別用途的小表。
- 這樣最原始也最龐大的資料過了半年就可以進入 cool zone、超過一年/或是三年的進入 cold zone。