1. 程式人生 > >流式大資料處理的三種框架:Storm,Spark和Flink

流式大資料處理的三種框架:Storm,Spark和Flink

storm、spark streaming、flink都是開源的分散式系統,具有低延遲、可擴充套件和容錯性諸多優點,允許你在執行資料流程式碼時,將任務分配到一系列具有容錯能力的計算機上並行執行,都提供了簡單的API來簡化底層實現的複雜程度。

Apache Storm

Storm中,先要設計一個用於實時計算的圖狀結構,我們稱之為拓撲(topology)。這個拓撲將會被提交給叢集,由叢集中的主控節點(master node)分發程式碼,將任務分配給工作節點(worker node)執行。一個拓撲中包括spout和bolt兩種角色,其中spout傳送訊息,負責將資料流以tuple元組的形式傳送出去;而bolt則負責轉換這些資料流,在bolt中可以完成計算、過濾等操作,bolt自身也可以隨機將資料傳送給其他bolt。由spout發射出的tuple是不可變陣列,對應著固定的鍵值對。



Apache Spark

Spark Streaming是核心Spark API的一個擴充套件,它並不會像Storm那樣一次一個地處理資料流,而是在處理前按時間間隔預先將其切分為一段一段的批處理作業。Spark針對持續性資料流的抽象稱為DStream(DiscretizedStream),一個DStream是一個微批處理(micro-batching)的RDD(彈性分散式資料集);而RDD則是一種分散式資料集,能夠以兩種方式並行運作,分別是任意函式和滑動視窗資料的轉換。


Apache Flink

Flink 是一個針對流資料和批資料的分散式處理引擎。它主要是由 Java 程式碼實現。對 Flink 而言,其所要處理的主要場景就是流資料,批資料只是流資料的一個極限特例而已。再換句話說,Flink 會把所有任務當成流來處理,這也是其最大的特點。Flink 可以支援本地的快速迭代,以及一些環形的迭代任務。並且 Flink 可以定製化記憶體管理。在這點,如果要對比 Flink 和 Spark 的話,Flink 並沒有將記憶體完全交給應用層。這也是為什麼 Spark 相對於 Flink,更容易出現 OOM 的原因(out of memory)。就框架本身與應用場景來說,Flink 更相似與 Storm。

Flink 的架構圖。


對比圖:


(比較源自大牛的PPT,現在新版storm有很多改進,比如自動反壓機制之類,另外storm trident API也能提供有狀態操作與批處理等)

怎麼選擇

如果你想要的是一個允許增量計算的高速事件處理系統,Storm會是最佳選擇。

如果你必須有狀態的計算,恰好一次的遞送,並且不介意高延遲的話,那麼可以考慮Spark Streaming,特別如果你還計劃圖形操作、機器學習或者訪問SQL的話,Apache Spark的stack允許你將一些library與資料流相結合(Spark SQL,Mllib,GraphX),它們會提供便捷的一體化程式設計模型。尤其是資料流演算法(例如:K均值流媒體)允許Spark實時決策的促進。
Flink支援增量迭代,具有對迭代自動優化的功能,在迭代式資料處理上,比Spark更突出,Flink基於每個事件一行一行地流式處理,真正的流式計算,流式計算跟Storm效能差不多,支援毫秒級計算,而Spark則只能支援秒級計算。

參考:

http://www.csdn.net/article/2015-03-09/2824135

http://www.csdn.net/article/2015-07-16/2825232