Samza文件翻譯 : Backgroud

devos發表於2014-04-06
這一頁提供了關於流處理的背景知識,描述什麼是Samza,以及它為何而生。

what is messaging?什麼叫訊息?

訊息系統是用來實現近實時非同步計算的一種流行方式。當事件發生時,訊息可以被放在訊息佇列裡(ActiveMQ, RabbitMQ),釋出-訂閱系統(Kestrel, Kafka)裡,或者日誌彙集系統(Flume,Scribe)裡。下游的消費者從這些系統裡讀訊息,進行處理,或者根據訊息內容採取行動。
 
假如你有一個網站,並且每次有人載入一個網頁,就傳送發一個"使用者檢視了頁面"的訊息到訊息系統。你可能會有做以下任意事情的consumer:
  • 把訊息儲存到Hadoop,用來以後分析
  • 計算頁面訪問量並且更新到dashboard
  • 如果頁面訪問失敗,觸發一個警報Background
  • 傳送一個電子郵件通知另一個使用者
  • 把頁面訪問事件和使用者的檔案合在一起,把合併後的訊息發回給訊息系統
一個訊息系統使你將以上的工作和實際的網頁服務解耦合。
 

What is stream processing?  什麼叫流處理

 
一個訊息系統是相當低層級一部分基礎設施——它儲存訊息,等待consumers來消費它。當你開始寫程式碼來生產或消費訊息,你很快就會發現在處理層有很多難對付的問題。Samza的目標就是幫助解決這些問題。
 
用上面的網頁訪問計數的例子(計算訪問量,然後更新dashboard)來說。你的消費者執行在的機器出現故障,並且你當前的計數器的值丟失了,將會發生什麼?你怎麼來恢復?當處理程式重啟時,它應該在哪執行?如果底層的訊息系統傳送給你兩次同樣的訊息,或者丟失一個訊息,應該怎麼辦?(除非你很小心,否則你的計數器可能就不正確了)。如果單獨一臺機器沒有足夠的計算能力,你怎麼把計算分佈到多臺機器上。
 
流處理是訊息系統之上的更高階別的抽象,它就是用來精確地解決這一類問題。
 

Samza

 
samza是一個流處理框架,它有以下特性:
  • 簡單的API:不像大多數低層級的訊息系統的API,Samza提供了一個非常簡單的,基於回撥的 “訊息處理”  API,和MapReduce類似。
  • 受控的狀態:Samza管理“流處理器”的快照和恢復。當一個流處理器重啟,Samza會恢復它的狀態到一個一致的快照。Samza被構建來處理大規模的狀態(每個分割槽數GB).
  • 容錯:當叢集中的任何一個機器發生故障,Samza和YARN一起透明地遷移你的task到另一臺機器。
  • Durability永續性: Samza使用Kafka來保證訊息按照他們寫入一個partition的順序被處理,並且不會有訊息丟失。
  • Scalability可擴充套件:Samza在各個層面上都是分割槽的以及分散式的。Kafka提供了有序的、分割槽的、可回放的、容錯的訊息流。YARN提供給Samza容器一個分散式的環境來執行。
  • Pluggable可插拔的:雖然Samza自帶對Kafka和YARN的支援,但是Samza同時提供了可插拔的API來讓你在別的訊息系統和執行環境中執行Samza。
  • Processor isolation處理器隔離:Samza與Apache YARN一起工作。YARN提供了Hadoop的安全模型,以及利用Linux CGruops的資源隔離。

其它選擇

 
現在可用的開源流處理系統都實際上非常新,沒有一個單獨的系統提供了所有的解決方案。這個領域的新問題包括:怎麼管理流處理器的狀態?是否一個流應該被遠端快取在硬碟上?當重複的訊息被接收或者訊息丟失時應該怎麼做?怎麼對底層的訊息系統建模?
 
Samza的主要區分點在於:
  • Samza支援本地狀態的容錯。狀態可以被想象成一些表,它們被分成很多塊,和各個處理工作分佈到一起。狀態本身被建模成一個流。如果本地狀態由於機器故障丟失,狀態流就會被回放,以重建它。
  • 流是有序的、分割槽的、可以回放的、容錯的
  • YARN被用來做處理器隔離、安全、以及容錯
  • 任務之間是解耦合的:如果一個job很慢,積壓了一些未處理的訊息,其它的系統不會受影響。
如果想要一個對Smaza更深層的討論,以及它和其它的流處理系統的關係,看一下Samza的Comparision文件吧。

相關文章