馬化騰漫談「流式大數據處理的三種框架:Storm,Spark和Samza」

Apache Stormnode

Storm中,先要設計一個用於實時計算的圖狀結構,咱們稱之爲拓撲(topology)。這個拓撲將會被提交給集羣,由集羣中的主控節點(master node)分發代碼,將任務分配給工做節點(worker node)執行。一個拓撲中包括spoutbolt兩種角色,其中spout發送消息,負責將數據流以tuple元組的形式發送出去;而bolt則負責轉換這些數據流,在bolt中能夠完成計算、過濾等操做,bolt自身也能夠隨機將數據發送給其餘bolt。由spout發射出的tuple是不可變數組,對應着固定的鍵值對。算法

54fcc9176d069.jpg


Apache Sparkapache

Spark Streaming是核心Spark API的一個擴展,它並不會像Storm那樣一次一個地處理數據流,而是在處理前按時間間隔預先將其切分爲一段一段的批處理做業。Spark針對持續性數據流的抽象稱爲DStream(DiscretizedStream),一個DStream是一個微批處理(micro-batching)的RDD(彈性分佈式數據集);而RDD則是一種分佈式數據集,可以以兩種方式並行運做,分別是任意函數和滑動窗口數據的轉換。編程

54fcc92668e64.jpg


Apache Samza數組

Samza處理數據流時,會分別按次處理每條收到的消息。Samza的流單位既不是元組,也不是Dstream,而是一條條消息。在Samza中,數據流被切分開來,每一個部分都由一組只讀消息的有序數列構成,而這些消息每條都有一個特定的ID(offset)。該系統還支持批處理,即逐次處理同一個數據流分區的多條消息。Samza的執行與數據流模塊都是可插拔式的,儘管Samza的特點是依賴Hadoop的Yarn(另外一種資源調度器)和Apache Kafka。框架

54fcc934cdca1.jpg


共同之處機器學習

以上三種實時計算系統都是開源的分佈式系統,具備低延遲、可擴展和容錯性諸多優勢,它們的共同特點在於:容許你在運行數據流代碼時,將任務分配到一系列具備容錯能力的計算機上並行運行。此外,它們都提供了簡單的API來簡化底層實現的複雜程度。編程語言

三種框架的術語名詞不一樣,可是其表明的概念十分類似:分佈式

54fcc951a9ca5.jpg


對比圖ide

下面表格總結了一些不一樣之處:

54fcc977a2d5b.jpg


數據傳遞形式分爲三大類:


  1. 最多一次(At-most-once):消息可能會丟失,這一般是最不理想的結果。

  2. 最少一次(At-least-once):消息可能會再次發送(沒有丟失的狀況,可是會產生冗餘)。在許多用例中已經足夠。

  3. 剛好一次(Exactly-once):每條消息都被髮送過一次且僅僅一次(沒有丟失,沒有冗餘)。這是最佳狀況,儘管很難保證在全部用例中都實現。


另外一個方面是狀態管理:對狀態的存儲有不一樣的策略,Spark Streaming將數據寫入分佈式文件系統中(例如HDFS);Samza使用嵌入式鍵值存儲;而在Storm中,或者將狀態管理滾動至應用層面,或者使用更高層面的抽象Trident。

用例

這三種框架在處理連續性的大量實時數據時的表現均出色而高效,那麼使用哪種呢?選擇時並無什麼硬性規定,最多就是幾個指導方針。

若是你想要的是一個容許增量計算的高速事件處理系統,Storm會是最佳選擇。它能夠應對你在客戶端等待結果的同時,進一步進行分佈式計算的需求,使用開箱即用的分佈式RPC(DRPC)就能夠了。最後但一樣重要的緣由:Storm使用Apache Thrift,你能夠用任何編程語言來編寫拓撲結構。若是你須要狀態持續,同時/或者達到剛好一次的傳遞效果,應當看看更高層面的Trdent API,它同時也提供了微批處理的方式。

54fcc9961afed.jpg


使用Storm的公司有:Twitter,雅虎,Spotify還有The Weather Channel等。

說到微批處理,若是你必須有狀態的計算,剛好一次的遞送,而且不介意高延遲的話,那麼能夠考慮Spark Streaming,特別若是你還計劃圖形操做、機器學習或者訪問SQL的話,Apache Spark的stack容許你將一些library與數據流相結合(Spark SQL,Mllib,GraphX),它們會提供便捷的一體化編程模型。尤爲是數據流算法(例如:K均值流媒體)容許Spark實時決策的促進。

使用Spark的公司有:亞馬遜,雅虎,NASA JPLeBay還有百度等。

若是你有大量的狀態須要處理,好比每一個分區都有許多十億位元組,那麼能夠選擇Samza。因爲Samza將存儲與處理放在同一臺機器上,在保持處理高效的同時,還不會額外載入內存。這種框架提供了靈活的可插拔API:它的默認execution、消息發送還有存儲引擎操做均可以根據你的選擇隨時進行替換。此外,若是你有大量的數據流處理階段,且分別來自不一樣代碼庫的不一樣團隊,那麼Samza的細顆粒工做特性會尤爲適用,由於它們能夠在影響最小化的前提下完成增長或移除的工做。

使用Samza的公司有:LinkedInIntuitMetamarketsQuantiplyFortscale等。

結論

本文中咱們只對這三種Apache框架進行了簡單的瞭解,並未覆蓋到這些框架中大量的功能與更多細微的差別。同時,文中這三種框架對比也是受到限制的,由於這些框架都在一直不斷的發展,這一點是咱們應當牢記的。

相關文章
相關標籤/搜索