Flink預定義時間戳提取器/水印發射器

一.簡介

Flink提供了抽象,允許程序員分配自己的時間戳併發出自己的水印。更具體地說,根據使用情況,可以通過實現AssignerWithPeriodicWatermarks和AssignerWithPunctuatedWatermarks接口之一來實現。簡而言之,第一個將定期發出水印,而第二個則根據傳入記錄的某些屬性發出水印,例如,每當流中遇到特殊元素時。

爲了進一步簡化此類任務的編程工作,Flink附帶了一些預先實現的時間戳分配器。

二.時間戳遞增的分配器

定期生成水印的最簡單的特殊情況是給定源任務看到的時間戳以升序出現的情況。在這種情況下,當前時間戳始終可以充當水印,因爲沒有更早的時間戳會到達。

請注意,每個並行數據源任務只需要增加時間戳即可。例如,如果在一個特定的設置中一個並行數據源實例讀取一個Kafka分區,則僅在每個Kafka分區內將時間戳遞增是必要的。每當對並行流進行混洗,連接或合併時,Flink的水印合並機制都會生成正確的水印。

val stream : DataStream[MyEvent] = ...
val withTimestampsAndWatermarks = stream.assignAscendingTimestamps( _.getCreationTime )

三.分配器允許固定的延遲時間

週期性水印生成的另一個情況是水印在流中看到的最大(事件時間)時間戳落後固定時間。這種情況涵蓋了預先知道流中可能遇到的最大延遲的場景,例如,當創建包含時間戳的元素的自定義源時,該時間戳在固定時間段內傳播以進行測試。對於這些情況,Flink提供了BoundedOutOfOrdernessTimestampExtractor,將用作參數maxOutOfOrderness,即在計算給定窗口的最終結果時允許元素延遲到被忽略之前的最長時間。延遲對應於的結果t - t_w,其中t元素的(事件時間)時間戳和t_w前一個水印的時間戳。如果lateness > 0那麼該元素將被認爲是較晚的元素,默認情況下,在爲其相應窗口計算作業結果時將其忽略。

val stream: DataStream[MyEvent] = ...
val withTimestampsAndWatermarks = stream.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor[MyEvent](Time.seconds(10))( _.getCreationTime ))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章