flink 的 datastream 必須掌握的內容
flink作為目前比較火的流處理引擎,學好還是很有必要的,但是很多人喜歡問浪尖flink會不會超越spark,我覺得短期內還是不會,而且spark 批處理領域還是很高效靠譜的。但是作為大資料開發者,spark和flink並不是必須二選一的,而是都要掌握,所以也不用再問浪尖,關於是否直接跳過spark 直接學習flink這類問題了,沒意義。
flink的處理模型可以分為基於事件驅動的處理和基於時間的處理模型,基於時間的處理模型又可以分為基於事件時間和處理時間(注入時間就是一種特殊的事件時間)。下面我們就來概述一下,flink的DataStream我們應該學習哪些內容。
1.runtime
必須要先非常瞭解flink的runtime機制,拓撲結構相關的如並行度設定,task劃分原則,task鏈式原理,slot共享機制等。
關於flink的runtime可以參考浪尖前面的文章
要理解這個其實可以參考Spark Streaming和Structured Steaming的執行模型和flink的區別。可以參考
這樣便於我們瞭解flink內部執行原理,資料流動方式,shuffle機制,狀態管理等,有助於資料傾斜調優,並行度設定,監控告警系統設計。最終才能做好一個比較穩定的應用程式。
2.事件處理
事件驅動處理模型,這個是實時處理的典型代表,就這點來說spark的流處理引擎確實比不上,因為其是基於處理時間的微批處理(當然,structured Streaming也支援基於事件時間的處理模型)。
對於 flink的事件處理 來說,除了前面所說的 runtime ,還要搞清楚 flink datastream 的 事件時間機制,watermark生成器,並行度原理,shuffle劃分,資料流動原理,狀態管理及超時key狀態刪除等 這幾個非常重要的內容。這樣便於理解資料在flink執行時內部流動過程,狀態在flink自任務儲存的過程,然後資料傾斜與否,狀態過期刪除及主要是資料傾斜及狀態管理吧,這個是flink任務調優的。
當然,flink還是有很多比較騷的操作的,比如下面幾篇文章:
-
flink的神奇分流器-sideoutput -可以實現資料分流處理。
-
Flink迭代操作末文-迭代流 -迭代計算處理。
-
flink一次對整個視窗進行聚合操作-ProcessWindowFunction -
也即是process這類底層的api,可以對狀態及時間進行更精細的草走,甚至可以自己實現自己的會話視窗。
-
Flink非同步IO第一講-非同步IO 可以實現更加高效的維表join操作。
這些小技巧還是很有必要的掌握的。
3. 視窗函式
主要是這個分為基於事件時間的視窗函式和基於處理時間的視窗函式。視窗函式又分為會話視窗函式,滑動時間視窗,滾動時間視窗。更騷的操做是更底層的視窗處理函式及視窗處理機制也即是 ProcessFunction和 ProcessWindowFunction ,便於我們獲取更深層次的狀態和時間。
剩下的還有就是視窗的join操作:
-
滾動視窗join
-
滑動視窗join
-
會話視窗join
-
inerval join
有事件時間必然有事件延遲處理,如何處理基於事件時間的視窗函式延遲事件這個是令人頭疼的問題。當然,對於編碼來說還是可以很好的對延遲事件進行處理的,比如結合側輸出,watermark,延遲時間等。
4.邊緣生態
常用的flink邊緣生態,資料來源是kafka,批處理的話是hdfs上資料,然後sink是hbase,mysql,hbase,mongodb。
5.實現案例
下面,浪尖在星球裡分享的相關原始碼,有興趣的球友可以去參考閱讀一下:
-
org.datastream.KafkaProducer
該類主要是用來生產測試資料用的。
watermark,自定義處理trigger視窗處理機制可以參考下面兩個目錄裡的案例程式碼:
-
org.datastream.trigger
-
org.datastream.watermark
-
org.datastream.windows
對於 join 操作,目前 flink 不支援 datastream 與靜態資料集的 join 操作,普通的視窗 join 可以參考下面原始碼
想要與靜態資料集的 join ,可以實現同步和非同步的 join 操作,浪尖這裡實現了同步基於 flatmap 的,非同步的基於非同步 IO 的 join 操作,基本滿足企業開發的需求。
Sideoutput 側輸出,這個可以實現資料分流的功能,也是非常好用,主要是在處理延遲資料和普通資料分流的時候使用。
迭代輸出,主要是分批處理和流處理的迭代輸出。程式碼案例總共三個,實際上機器學習哪些 lib 包裡有更多。
Source 主要是 kafka , sink 實現了三種 redis , mysql , hbase ,這三個比較常用。
還有比較重要的配置,比如 checkpoint ,時間戳分配器,事件時間,處理時間,自動故障恢復等等比較實用的需求。
現在分享了原理及案例,詳細的講解視訊正在錄製,歡迎大家加入浪尖知識星球