在講到規模化 data pipeline 之前,我們必須要介紹到一個重要的資料處理框架:MapReduce,MapReduce 是 Google 在 2004 所發表一篇重要研究論文(天知道他們已經在內部使用這項技術多久了,所以說 Google 裡面一堆黑科技,真的可比做是當年半導體界的 Intel 啊...),而後續有許多專案使用的這項技術如 Apache Pardo。
在 MapReduce 中處理資料,一開始便是將資料分割,每塊被分割的資料將被分散儲存在運算叢集中,而在這樣的框架中運行 job,你要撰寫 Map 和 Reduce 兩個函式。
一個 Map 函式應該是 stateless,以便可以將其安排跨叢集中的節點來做平行運行,每個 Map 都從此運行的節點上讀取數據、處理數據並產生輸出。Map 運行的輸出會在不同節點間洗牌後傳進下一個階段:Reduce。
而 Reduce 的部分則可以視為是對資料做聚合的操作,這類聚合的操作例如像計算資料內的個數、加總等等。
當 Reduce 的動作結束後,資料處理的結果就是 pipeline 的輸出,下圖是整個運作過程的示意:
另外 Map 的關係也不見得只限於1對1,也可以是多對多,下面使用 beam.Map()
和 beam.FlatMap()
分別作為例子:
若你很習慣 GroupByKey 的用法,這邊也可以使用 beam.GroupByKey()
:
不過 Combine PerKey 是更常見的操作,它包含了洗牌和 Reduce 的步驟來幫助你實現聚合運算例如說加總、計算,下面是 Combine
的例子。
在這個實作中,我們將學會:
is_popular.py
:beam.FlatMap()
)、加總、取出前5名,到最後的輸出:./is_popular.py
cat /tmp/output-*
./is_popular.py --output_prefix=/tmp/myoutput
ls -lrt /tmp/myoutput*
今天介紹了在 Dataflow pipeline 中,Map 和 Reduce 操作,明天我們將介紹 “使用Cloud Dataprep做資料前處理”。