Samza MUPD8

2018-08-23 09:43 更新

人們通常想知道類似的系統(tǒng)如何比較。我們已盡全力將 Samza 的功能集與其他系統(tǒng)進行對比。但是我們不是這些框架的專家,當然我們也是完全有偏見的。如果我們有任何東西,請讓我們知道,我們會糾正。

耐久力

MUPD8 沒有耐久性或交貨保證。在 MUPD8 中,流處理器任務(wù)最多只能接收一次消息。Samza 使用 Kafka 進行消息傳遞,保證消息傳送。

訂購

與耐用性一樣,開發(fā)人員理想地喜歡他們的流處理器按照他們寫的順序接收消息。

基于對 MUPD8 對其排序保證的描述的理解,它保證所有消息將按照寫入 MUPD8 隊列的順序進行處理,這與 Kafka 和 Samza 的保證相當。

緩沖

處理大數(shù)據(jù)流的一個關(guān)鍵問題是在一個下游處理階段變慢時處理背壓。

當在兩個 MUPD8 任務(wù)之間傳遞消息時,MUPD8 會緩沖內(nèi)存中隊列中的消息。當隊列填滿時,開發(fā)人員可以選擇將消息放在地板上,將消息記錄到本地磁盤或阻塞,直到隊列釋放。所有這些選項都是次優(yōu)的。刪除郵件會導(dǎo)致錯誤的結(jié)果。阻塞流處理器可能具有級聯(lián)效應(yīng),其中最慢的處理器阻止所有上游處理器,而后者又阻止其上游處理器,直到整個系統(tǒng)停止。登錄到本地磁盤是最合理的,但是當發(fā)生故障時,這些消息在故障切換時丟失。

通過采用 Kafka 的經(jīng)紀人作為遠程緩沖區(qū),Samza 解決了所有這些問題。它不需要阻止,因為消費者和生產(chǎn)者使用卡夫卡經(jīng)紀人的磁盤作為緩沖區(qū)進行解耦。消息不會被丟棄,因為 Kafka 經(jīng)紀人從0.8版本開始高度可用。如果發(fā)生故障,當 Samza 作業(yè)在另一臺計算機上重新啟動時,其輸入和輸出不會丟失,因為它們遠程存儲在復(fù)制的 Kafka 代理上。

狀態(tài)管理

引言所述,流處理器在處理消息時通常需要保持一些狀態(tài)。不同的框架具有不同的處理這種狀態(tài)的方法,以及在出現(xiàn)故障時該怎么辦。

MUPD8 使用寫回緩存策略來管理定期寫回 Cassandra 的內(nèi)存狀態(tài)。

Samza 在任務(wù)中維持當?shù)氐臓顟B(tài)。這允許狀態(tài)大于適合內(nèi)存的狀態(tài)。狀態(tài)被持久化到輸出流,以便在任務(wù)失敗時啟用恢復(fù)。我們認為這種設(shè)計能夠?qū)崿F(xiàn)更強的容錯語義,因為變更日志會捕獲狀態(tài)的演變,從而使任務(wù)的狀態(tài)恢復(fù)到一致的時間點。

部署和執(zhí)行

MUPD8 包括一個自定義執(zhí)行框架。該框架在用戶和資源限制方面支持的功能對我們來說并不清楚。

Samza 利用 YARN 部署用戶代碼,并在分布式環(huán)境中執(zhí)行。

容錯

流處理系統(tǒng)在機器或處理器出現(xiàn)故障時應(yīng)該做什么?

MUPD8 使用其相當于 YARN 的定制來管理容錯。當流處理器無法向下游處理器發(fā)送消息時,它會通知 MUPD8 的協(xié)調(diào)器,并通知所有其他計算機。然后機器將根據(jù)所使用的密鑰哈希發(fā)送所有的消息到新的機器。發(fā)生這種情況時,消息和狀態(tài)可能會丟失。

Samza 使用 YARN 來管理容錯。YARN 檢測節(jié)點或 Samza 任務(wù)何時失敗,并通知 Samza 的ApplicationMaster。在這一點上,由 Samza 決定要做什么。通常,這意味著在另一臺機器上重新啟動任務(wù)。由于消息能夠遠程存儲到卡夫卡經(jīng)紀人,并且沒有內(nèi)存中的隊列,所以不應(yīng)丟失消息(除非處理器使用異步卡夫卡生產(chǎn)者,提供更高的性能,但不要等待消息被提交)。

工作流程

有時候需要多個工作或處理階段來完成某些工作。例如,您希望重新分區(qū)流的情況。MUPD8 有一個自定義的工作流程系統(tǒng)設(shè)置,用于定義如何一次執(zhí)行多個作業(yè),以及如何將流數(shù)據(jù)從一個進程導(dǎo)入另一個。

Samza 使單個作業(yè)的執(zhí)行細分級別。作業(yè)通過命名輸入和輸出流進行通信。這隱式定義了所有正在運行的作業(yè)之間的數(shù)據(jù)流圖。我們選擇了這個模型,使不同工作人員擁有不同工程師的處理階段的數(shù)據(jù)流圖可以在不同的代碼庫中工作,而無需將所有內(nèi)容都集成到一個拓撲中。

這是由于我們在 Hadoop 中的經(jīng)驗,其中作業(yè)之間的數(shù)據(jù)流由其輸入和輸出目錄隱含地定義。這種分散的模式已被證明可以很好地擴展到一個大型組織。

記憶

MUPD8 使用線程在單個 JVM 內(nèi)執(zhí)行其所有映射/更新處理器。這是內(nèi)存高效的,因為 JVM 內(nèi)存開銷是跨線程共享的。

Samza 為每個流處理器容器使用單獨的 JVM 。與在單個 JVM 中運行多個流處理線程相比,這具有使用更多內(nèi)存的缺點。然而,優(yōu)點是改進了任務(wù)之間的隔離,這可以使它們更可靠。

隔離

MUPD8 在流處理器之間不提供資源隔離。單個不良行為的流處理器可以降低節(jié)點上的所有處理器。

Samza 在流處理器任務(wù)之間使用流程級隔離,類似于 Hadoop 的方法。我們可以強制執(zhí)行嚴格的每進程內(nèi)存限制。此外,Samza 在與 YARN cgroup 一起使用時支持 CPU 限制。隨著 YARN 對 cgroup 的支持進一步發(fā)展,還應(yīng)該可以支持磁盤和網(wǎng)絡(luò) cgroup 限制。

進一步閱讀

MUPD8 團隊發(fā)表了一篇關(guān)于他們系統(tǒng)設(shè)計的非常好的論文

Storm ?

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號