繁体   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