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