對于 MapReduce 和 Spark 來講,這些數(shù)據(jù)是一大批數(shù)據(jù),也稱之為有界數(shù)據(jù),對這些數(shù)據(jù)的計算就稱為批計算。
隨著移動互聯(lián)網(wǎng)、物聯(lián)網(wǎng)的興起,每分每秒都在產(chǎn)生大量的數(shù)據(jù),例如傳感器產(chǎn)生的數(shù)據(jù)、訂單交易數(shù)據(jù)、用戶行為記錄等。這些無時不刻都在產(chǎn)生的數(shù)據(jù),我們稱之為無界數(shù)據(jù)或流數(shù)據(jù)。通常被用于用戶行為分析進(jìn)行實時推薦、銷售數(shù)據(jù)實時分析進(jìn)行營銷策略調(diào)整等場景。
MapReduce 和 Spark 這樣的批計算系統(tǒng)就滿足不了實時計算的需求。所以就誕生了 Storm、Spark Streaming、Flink這些流計算系統(tǒng)。
批計算和流計算整體工作流程大體一致,都有任務(wù)調(diào)度、計算結(jié)果聚合等過程。只不過因為數(shù)據(jù)源的原因,執(zhí)行細(xì)節(jié)上會有所不同。這里有幾個概念需要進(jìn)行區(qū)分,避免混淆:
- 資源(計算節(jié)點)分配:
批計算是對一批數(shù)據(jù)進(jìn)行一次計算,所以在每次調(diào)度計算任務(wù)時分配資源,計算完成后,對應(yīng)的資源就會被釋放,下次在執(zhí)行時重新分配資源。
流計算是對實時流進(jìn)系統(tǒng)的數(shù)據(jù)進(jìn)行不間斷的計算,所以計算資源會一次分配完成,后續(xù)的計算任務(wù)會一直運行,直到程序異常任務(wù)停止才會釋放資源。
- 任務(wù)調(diào)度:
- 批計算是因為歷史數(shù)據(jù)量過大,數(shù)據(jù)源是分布在各個節(jié)點的數(shù)據(jù)塊,所以會根據(jù)數(shù)據(jù)所在地進(jìn)行任務(wù)調(diào)度(數(shù)據(jù)、計算本地化)。
- 流計算數(shù)據(jù)源通常是Socket、Kafka中的一條條數(shù)據(jù),所有的計算任務(wù)在這之前已經(jīng)根據(jù)并行度調(diào)度到各個節(jié)點,數(shù)據(jù)來臨時根據(jù)某個策略分配給某個計算任務(wù)。
由于 Spark Streaming 是建立在 Spark 基礎(chǔ)上,所以任務(wù)執(zhí)行還是 Spark 的邏輯,所以 Spark Streaming 算是一個“偽”流計算系統(tǒng),屬于批計算這一波。
簡單來說 Spark Streaming 通過很小的時間間隔(例如1秒)將實時數(shù)據(jù)收集為“微批”數(shù)據(jù),然后然后交給 Spark 處理。
Spark Streaming 微批數(shù)據(jù)
因為是間隔一段時間再去計算,所以在實時性方面,Spark Streaming 就不如 Flink,現(xiàn)在說起流計算基本上就是在討論 Flink 了。不過兩者的架構(gòu)和概念有很多相似的地方,也都是函數(shù)式編程。如果掌握了 Spark ,學(xué)習(xí) Flink 也就非常簡單輕松了。
至于 Storm ,作為早期的實時計算引擎并不支持有狀態(tài)計算和exactly-once的語義,以及編碼相對復(fù)雜,所以現(xiàn)在也慢慢被大家遺忘。
如果有“Spark Streaming 收集的數(shù)據(jù)是怎么分區(qū)的?”、“什么是有狀態(tài)計算和exactly-once語義?”、“Flink 是如何做到數(shù)據(jù)、計算本地化?”