[Data] Data Pipeline 101(五) — 冪等性

Bryan Yang
A multi hyphen life
3 min readApr 4, 2020

--

idempotence 真的很難翻譯內

https://www.sketchplanations.com/post/156451100996/idempotence-a-term-id-always-found-intriguing

在設計管線系統以及 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 程式除了業務邏輯外,還包括了資料。所以要達到冪等性必有兩個前提:

  1. ETL 程式必須能夠被重複執行
  2. 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。

  1. 剛進來的原始資料都放在熱區供 ETL 使用
  2. 會透過一個或幾個 ETL 整理出時間粒度較粗、維度非常多的大表。
  3. 其他 ETL 會再根據上面這幾個大表產生後續比較特別用途的小表。
  4. 這樣最原始也最龐大的資料過了半年就可以進入 cool zone、超過一年/或是三年的進入 cold zone。

--

--

Bryan Yang
A multi hyphen life

Data Engineer, Data Producer Manager, Data Solution Architect