天天看點

Flink time概念

Flink time概念

   Flink在流程式中支援不同的Time概念,就比如有Processing Time、Event Time和Ingestion Time。

  • Event Time:資料源産生的事件時間
    • Event Time 是事件發生的時間,一般就是資料本身攜帶的時間。這個時間通常是在事件到達 Flink 之前就确定的,并且可以從每個事件中擷取到事件時間戳。在 Event Time 中,時間取決于資料,而跟其他沒什麼關系。Event Time 程式必須指定如何生成 Event Time 水印,這是表示 Event Time 進度的機制。
  • Ingestion Time:事件進入(接入)flink的時間
    • Ingestion Time 是事件進入 Flink 的時間。 在源操作處,每個事件将源的目前時間作為時間戳,并且基于時間的操作(如時間視窗)會利用這個時間戳。
  • Processing Time:flink算子操作時間
    • Processing Time是指事件被處理時機器的系統時間。
    • 當流程式在Processing Time上運作時,所有基于時間的操作(如時間視窗)将使用當時機器的系統時間。每小時Processing Time 視窗将包括在系統時鐘訓示整個小時之間到達特定操作的所有事件。
    • Processing Time 是最簡單的 "Time" 概念,不需要流和機器之間的協調,它提供了最好的性能和最低的延遲。但是,在分布式和異步的環境下,Processing Time 不能提供确定性,因為它容易受到事件到達系統的速度(例如從消息隊列)、事件在系統内操作流動的速度以及中斷的影響。
Flink time概念

EventTime和watermark

什麼是水印(watermarks)

        Flink中檢測事件時間處理進度的機制就是水印,Watermark作為資料處理流中的一部分進行傳輸,并且攜帶一個時間戳t。一個Watermark(t)表示流中應該不再有事件時間比t小的元素(某個事件的時間戳比 Watermark 時間大)。

        Watermark是Apache Flink為了處理EventTime 視窗計算提出的一種機制,本質上也是一種時間戳,由Apache Flink Source或者自定義的Watermark生成器按照需求Punctuated或者Periodic兩種方式生成的一種系統Event,與普通資料流Event一樣流轉到對應的下遊算子,接收到Watermark Event的算子以此不斷調整自己管理的EventTime clock。 Apache Flink 架構保證Watermark單調遞增,算子接收到一個Watermark時候,架構知道不會再有任何小于該Watermark的時間戳的資料元素到來了,是以Watermark可以看做是告訴Apache Flink架構資料流已經處理到什麼位置(時間次元)的方式。 Watermark的産生和Apache Flink内部處理邏輯如下圖所示:

Flink time概念
Flink time概念
Flink time概念

       上圖中,我們設定的允許最大延遲到達時間為2s,是以時間戳為7s的事件對應的Watermark是 5s,時間戳為12s的事件的Watermark是10s,如果我們的視窗1是1s~5s,視窗2是6s~10s,那麼時間戳為7s的事件到達時的Watermarker恰好觸發視窗1,時間戳為12s的事件到達時的Watermark恰好觸發視窗2。

目前Apache Flink 有兩種生産Watermark的方式,如下:

  • Punctuated - 資料流中每一個遞增的EventTime都會産生一個Watermark。在實際的生産Punctuated方式在TPS很高的場景下會産生大量的Watermark在一定程度上對下遊算子造成壓力,是以隻有在實時性要求非常高的場景才會選擇Punctuated的方式進行Watermark的生成。
  • Periodic - 周期性的(一定時間間隔或者達到一定的記錄條數)産生一個Watermark。在實際的生産中Periodic的方式必須結合時間和積累條數兩個次元繼續周期性産生Watermark,否則在極端情況下會有很大的延時。

是以Watermark的生成方式需要根據業務場景的不同進行不同的選擇。

繼續閱讀