Flink幾個重要概念和快速入門

Flink是什麼?

Flink是一款實時計算框架,能夠實現ms級別甚至更低的延時計算(流式處理),不少同學肯定會提及spark streaming(可認爲是批處理,類似Hive;這幾個框架只能做到準實時,ms級別的延時是達不到要求)。當然,如果你對延時容忍度高,那麼可以選擇這兩個框架

最具代表性的使用場景:阿里雙11大屏交易總金額的實時刷新

Flink如何實現流式處理?

對於批處理而言,當前提條件限制之後,數據的輸入是固定的;並且,在執行一次計算計劃的時候,要麼全部成功或者失敗。

對於流處理而言,數據如流水一般由源頭奔涌向下。那麼通過什麼準則去如何去抽取、約定你需要的數據呢?-----時間。更重要的是,由於流式計算中間也會遇到宕機、數據處理失敗等等問題,時間點也能作爲恢復範圍點重要參考

在Flink中有三個時間定義

  • Event time:事件本身發生的時間,與flink引擎無關。例如:用戶在某個時刻下單一個商品,訂單產生時間是事件時間
  • Processing Time:Flink處理數據時間
  • Ingestion Time:進入Flink框架時間。例如:訂單產生在9:00,那麼9:00是Event time;數據在9:00 30s時進入flink中(如果有較大延時),那麼9:00 30s這個時刻是Ingestion Time,然後數據在9:01被計算,9:01是Processing Time

                                               

Flink如何應對延時?

  • 延時產生原因:網絡抖動、計算資源不夠等一系列的原因,會導致在整個流處理過程中有較大的延時
  • 延時影響:可能導致部分計算結果不準確
    • 例如:我們用長度爲1h 的時間窗口  計算 9:00 -- 10:00 交易累計金額。在9:59 40s的時候確實產生了一條交易數據,那麼該條數據的事件時間是 9:59 40s。由於延時的問題,導致該條數據在 10:01 才被Flink讀取,因此該數據未能被計算(不在9:00 -10:00 窗口範圍內);一般在流計算的時候會進行批計算,在覈對結果的時候就會發現總金額少了 9:59 40s 這份數據
  • 如何處理延時:watermark (水位)
    • watermark:基於event time,告訴窗口函數,可能有數據還沒有來,你再等一等執行計算
    • watermark影響:但是watermark設置的越大,會帶來更大的延時,效果會越準確(最後可理解爲轉成了批處理?) ,具體根據業務場景來
    • 處理延時:在進行計算之前,設置一個水位點,例如設置2min。還是看上面的例子,假如不設水位那麼 9:59 40s 的數據必然會丟,那麼設置會怎麼樣呢?
      • 設置2min之後,在10:00 窗口觸發時間,窗口函數不會立馬觸發,而是會再等 2min,等到10:02觸發窗口計算。然後看這兩分鐘內是否還會有event time 在窗口內的數據(這段話細品、你細品)。因此,儘管9:59 40s 延時到 10:01 ,但是10:01 < 10:02 因此該條數據不會丟

Flink窗口函數(主要講複雜事件處理cep)

  • 滑動窗口
  • 滾動窗口
  • 會話窗口
  • cep機制(Complex event processing) -- 複雜事件處理:可認爲是一種爲事件窗
    • cep與前面三個窗口的區別在於:前面三個窗口是基於時間來處理流數據,而cep是根據事件定義來處理流數據。前面三個可以自行csdn 或者百度,都比較好理解,接下來主要講cep
  • cep如何工作?
    • 舉個例子:你開車從 A -> B點,然後你要計算這段行程中發生了哪些不良駕駛行爲,如急加速、減速等(如果有埋點數據次採集的話)。但是在這裏你用不了時間窗口進行聚合累加,因爲你不知道 A->B點得用多久,不同人也不一樣。爲什麼cep可以?因爲cep可以將一個事件流定義爲一個窗口,如A->B,點火可以認爲是行程開始,熄火可以認爲是行程的結束,(這裏不是很嚴謹,但是別槓,只是爲了說明cep怎麼用,再槓一起去搬磚)

                                                                                      

  • cep 完整定義
    • 事件開始
    • 中間事件
    • 事件結束
      • 通過上面事件定義,能夠將一個事件流從數據流從以窗口的方式剝離出來

   

Flink容錯

待補充

Flink查詢

  • 對於流計算而言,數據查詢是動態的,是持續查詢。原因是因爲每個時刻數據內容都在發生改變,那麼流數據是如何做到結果一致性的呢?
  • 接下來我們以Mysql的存儲過程舉例,說明Flink的持續查詢是如何實現
    • Mysql的任何操作都會被記錄在binlog中,將binlog轉爲中繼日誌可以實現備份的功能。我們也可以利用該日誌來模型持續查詢
    • 我們可以寫一個觸發器,一旦有新的數據進來之後,就進行查詢。然後通過一條條的數據插入,對應會有一次次的查詢結果
    • 對於無PK(主鍵)的表而言,事實上實現的是append
    • 對於有PK的表而言,實現的是update,但是Mysql
    • 需要注意:Mysql實現的是全量查詢,而在Flink中實現的是增量查詢Flink的持續查詢也可以這樣理解,當有一條數據來的時候Flink會進行一次查詢,數據流源源不斷,查詢結果也會不斷刷新,這個過程就是Flink的持續查詢

Flink中文文檔

https://flink.apachecn.org/#/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章