iT邦幫忙

DAY 27
0

分散式資料處理,以Stream Computing為例系列 第 27

Day 27: 如何追蹤每一個record的處理進度

在Stream Computing,一筆 record 可能會需要同時進行好幾種運算 (如: 更新各種counter, 計算統計值等等)。我們可以把一筆 record 從源頭到完成所有計算看做是一個 有向無循環圖 (Directed Acyclic Graph, DAG) 。

另外,一筆 record 所有運算可能分散在多個點節上處理,不見得每一個 record 只會在一個節點上處理。

這有點像是,我們雇了100個人,每個人可以從好幾個上游接工作,做一些處理後,再往好幾個下游丟。這樣的處理方式很難追蹤是否每個工作都順利完成 。而這正是Stream Computing要面對的問題。

接下來我以Storm為例,說明如何在DAG裡追蹤每一個record的處理進度。

每一筆 record 在最源頭會被指派一個 message ID,在每次處理完產生新資料的後續傳送中,都會帶這個ID,以分辨資料的源頭。有可能一筆資料有多個源頭 (如: 經過join之後)。這個 ID 會被用來追蹤,與該 record 相關的所有運算的完成狀況。

在每個階段處理完一筆input data,產生output data往下游送時,會向一個特別的角色(Ackor)發出 ack 或 fail 的回報,並帶有input data與output data的64 bit ID。在正常處理的狀況下,ackor會收到兩次同一個id (一次是產生該資料、一次是該資料處理完),表示該筆資料已經被處理完。由於資料量很多(每個record可以衍生出許多筆資料),所以不可能為每筆資料都維護一個counter。ackor採用的方式是為每一個record維護一個初始值為0的64 bit的value,每次收到一個id回報,就將value <- value XOR id。如果每個id都出現兩次,那麼value又會回到0,就表示該record相關的處理都完成了。


上一篇
Day 26: Stream Computing 框架的組成角色
下一篇
Day 28: 錯誤處理機制
系列文
分散式資料處理,以Stream Computing為例30

尚未有邦友留言

立即登入留言