[英]Flink watermark is negative
我試圖通過在函數內部實現AssignerWithPeriodicWatermarks
來為流分配時間戳和水印,它實現:
override def getCurrentWatermark: Watermark = {
// this guarantees that the watermark never goes backwards.
val potentialWM = currentMaxTimestamp - maxOutOfOrderness
if (potentialWM >= lastEmittedWatermark) lastEmittedWatermark = potentialWM
new Watermark(lastEmittedWatermark)
}
override def extractTimestamp(element: T, previousElementTimestamp: Long): Long = {
val timestamp = element.streamTime // something exists in the stream
if (timestamp > currentMaxTimestamp) currentMaxTimestamp = timestamp
timestamp
}
但是,我仍然得到默認值-9223372036854775808
水印,當我嘗試在這兩個函數中添加打印時,我發現僅打印了extractTimestamp
中的println
, extractTimestamp
從未調用過getCurrentWatermark
函數。
實現似乎是正確的,因為相同的代碼能夠在另一個腳本上運行(有些代碼不是我寫的)。
PS:我不是第一次遇到負水印了,我發現經過一段時間后,水印會變成正水印,但是我仍然很困惑一開始發生了什么。
問題是您使用的AssignerWithPeriodicWatermark
不會按事件生成水印,而是按時間間隔生成水印。 每當您使用AssingerWithPeriodicWatermark
您都應該在執行環境中設置調用setTheAutowatermarkInterval
。 您提供的值將是調用getCurrentWatermark
的時間間隔。 如果你沒有設置它,那么該方法將永遠不會被調用,因此你永遠不會改變水印。 對於測試和學習,您可以考慮使用AssignerWithPunctuatedWatermark
因為這將簡單地為每個事件發出水印。
編輯:正如在這個答案autowatermarkInterval
, autowatermarkInterval
的默認值實際上是 200 毫秒。 此外,使用AssignerWithPunctuatedWatermark
並不意味着您需要為每個事件發出 Watermark,但會為每個事件調用發出它們的方法。 如果您不想發出水印,則該方法應簡單地返回null
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.