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則只能支持秒級計算。
參考鏈接:https://blog.csdn.net/jichuang123/article/details/86777577