六年前提起實時流式計算,熟悉的同窗會想起Storm,三年前提起,你們應該會想到Spark Streaming,如今再提起那無疑是Flink了。可見開源世界技術的迭代是飛速的,稍不留神就落伍了,因此咱們要不停地學習,跟着技術的浪潮上下翻滾,可是你學習的速度也沒法老是跟得上技術的更替,因此年紀大了依舊可能被淘汰,前浪老是會拍打到沙灘上,「你有沒有這種感受,好像一輩子都身不禁己」。算法
好了先不思考人生了,言歸正傳。
咱們先把 storm/spark/flink 這些花裏胡哨的技術都拋開,這些我以後的文章會詳細講,如今就說說實時流式計算自己。流式計算有什麼用呢?實際場景會告訴你:架構
流處理適用場景仍是很豐富的,它最大的特色就是及時,試想一些,沒有下面的這些流式計算系統,公司會損失多少MONEY:學習
時間對於批計算來講好像沒有什麼特別的,就是一個字段而已,可是流式計算裏,除了字段裏的那個時間(專業點,咱們稱這個時間爲事件時間event-time)還有一個數據到達的時間及處理系統的當前時間(處理時間process-time)。大數據
那問題來了,爲何要管這個處理時間?由於數據會有延遲,你處理的時間批次裏,可能會有好久以前的數據延遲到了如今,也有可能如今的數據沒有及時到達致使缺數。spa
不知道看到這裏你們會不會想到大數據比較經常使用的Lambda架構,先提供時效性高準確性較低的結果,而後對以前的數據作矯正,保證最終正確性(固然前提條件是批處理做業啓動時,須要的數據應該已經所有到達了)。對於這個問題的解決辦法實際上是和Lambda架構相似的,後面我會細說。orm
看上面的文字描述可能會有點抽象,咱們先來看看下面這幅圖,橫軸爲事件時間,縱軸爲處理時間,圈起來的數字表明真實的數據,它們分別都有事件時間和處理時間,在二者相同的理想狀況下,就如同下面淺色的虛線是一條直線,這樣是最好處理的,可是實際狀況倒是很曲折的,如深色的虛線,咱們把虛線稱爲水位線,水位線是根據必定算法根據最近處理的事件的事件時間估算出來的,能夠做爲事件的觸發的一個參考項。blog
上面提到了事件時間和處理時間,寫過SparkStreaming的同窗應該知道它有一個處理時間的窗口,就是說能夠對某個時間窗口內的數據進行聚合或者其餘操做,可是這個時間窗口的時間是基於處理時間的,一樣會有上面提到的問題,數據延遲了怎麼辦?事件
那麼理所固然會有人提出基於事件時間的窗口,這個處理方式就是《Google:DataFlow》中提出來的,spark和flink後來都有了相應的工程實現。spark
所謂觸發(Triggers)即時間窗口結束後對數據的處理方式。咱們直接來看《DataFlow》中的幾種觸發機制。io
撤回的操做適用於數據處理管道有多個串行的 GroupByKeyAndWindow 場景,撤回是必要的,由於同一個窗口的不一樣觸發計算結果可能在下游會被分組到不一樣鍵中去,這句話是關鍵,不知道你們有沒有理解,簡單地說就是,觸發時間的變化可能會致使這條延遲數據被分配到的組的變化,從而致使後續的聚合計算不許確,因此須要把以前的數據撤回,帶上這條數據一塊兒再作一次GroupByKeyAndWindow。
這一篇提到的不少概念和名字不少同窗可能一時會比較難消化,確實比較抽象,因此不要緊,後面講到flink的時候會舉具體的例子給你們看,這一篇只是和你們介紹下流式計算以及在流式計算中你須要重點關注的幾個點:時間/窗口/觸發,記住這三個詞也是一個收穫。
另外,你們有精力有時間有興趣的話,推薦你們好好看看Google在2015年發佈的一篇關於實時流式計算的論文,《The Dataflow Model》,這篇論文催生了spark的structed streaming以及給了當初默默無聞的flink成就如今輝煌的靈感。用詞好像有點浮誇了,可是它確實是在流式計算領域頗有指導性意義的一篇論文。
以爲有價值請關注 ▼