流式大資料處理的三種框架: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實時決策的促進。參考:
http://www.csdn.net/article/2015-03-09/2824135
http://www.csdn.net/article/2015-07-16/2825232