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則只能支持秒級計算。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章