簡體   English   中英

Flink水印為負

[英]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中的printlnextractTimestamp從未調用過getCurrentWatermark函數。

實現似乎是正確的,因為相同的代碼能夠在另一個腳本上運行(有些代碼不是我寫的)。

PS:我不是第一次遇到負水印了,我發現經過一段時間后,水印會變成正水印,但是我仍然很困惑一開始發生了什么。

問題是您使用的AssignerWithPeriodicWatermark不會按事件生成水印,而是按時間間隔生成水印。 每當您使用AssingerWithPeriodicWatermark您都應該在執行環境中設置調用setTheAutowatermarkInterval 您提供的值將是調用getCurrentWatermark的時間間隔。 如果你沒有設置它,那么該方法將永遠不會被調用,因此你永遠不會改變水印。 對於測試和學習,您可以考慮使用AssignerWithPunctuatedWatermark因為這將簡單地為每個事件發出水印。

編輯:正如在這個答案autowatermarkIntervalautowatermarkInterval的默認值實際上是 200 毫秒。 此外,使用AssignerWithPunctuatedWatermark並不意味着您需要為每個事件發出 Watermark,但會為每個事件調用發出它們的方法。 如果您不想發出水印,則該方法應簡單地返回null

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM