Apache flink 如何调试键控窗口上的多个触发器事件

Apache flink 如何调试键控窗口上的多个触发器事件,apache-flink,Apache Flink,我的数据流来自一个定制的SourceFunction,它以确定的顺序发出窗口大小的字符串序列。 其目的是基于EventTime在keyedstream上创建滑动窗口,以便对累积的字符串进行处理。 为了分配EventTime和水印,我将带有PeriodicWatermarks的赋值器附加到流。 滑动窗口由自定义ProcessWindow函数处理 env.setStreamTimeCharacteristic(EventTime) val seqStream = env.addSource(Seqs

我的数据流来自一个定制的SourceFunction,它以确定的顺序发出窗口大小的字符串序列。 其目的是基于EventTime在keyedstream上创建滑动窗口,以便对累积的字符串进行处理。 为了分配EventTime和水印,我将带有PeriodicWatermarks的赋值器附加到流。 滑动窗口由自定义ProcessWindow函数处理

env.setStreamTimeCharacteristic(EventTime)
val seqStream = env.addSource(Seqstream)
    .assignTimestampsAndWatermarks(SeqTimeStampExtractor())
    .keyBy(getEventtimeKey)
    .window(SlidingEventTimeWindows.of(Time.milliseconds(windowSize), Time.milliseconds(slideSize)))

val result = seqStream.process(ProcessSeqWindow(target1))
我的AssignerWithPeriodicWaterMarks如下所示:

class FASTATimeStampExtractor : AssignerWithPeriodicWatermarks<FASTAstring> {
    var waterMark  = 9999L
    override fun extractTimestamp(element: FASTAstring, previousElementTimestamp: Long): Long {
        return element.f1
    }

    override fun getCurrentWatermark(): Watermark? {
        waterMark += 1
        return Watermark(waterMark)
    }
}
class FASTATimeStampExtractor:具有周期性水印的赋值器{
var水印=9999L
覆盖时间戳(元素:FASTAstring,previousElementTimestamp:Long):长{
返回元素.f1
}
重写getCurrentWatermark():水印{
水印+=1
返回水印(水印)
}
}
换句话说,源发出的每个元素都应该有自己的EventTime,并且应该发出水印,在这段时间内不允许再发生任何事件。 在调试器中单步遍历流,表示生成了预期的EventTime/WatComments

我期望ProcessSeqWindow.run()应该在EventTime中使用与时间窗口成比例的大量元素(例如10毫秒)来调用。然而,我观察到的是,run()是使用单个元素多次调用的,并且是以与EventTime相关的任意顺序调用的。 当我强制并行性为1时,该行为仍然存在。 我的问题是,这可能是由每个窗口上的多个触发事件引起的,还是有其他可能的解释?如何调试原因


谢谢

水印在您的工作中的作用是触发关闭 滑动事件时间窗口的。为了扮演这个角色 正确地说,它们应该基于事件中的时间戳,而不是 比某个任意常数(9999L)大。相同对象的原因 负责提取时间戳并提供水印 以便此对象可以基于其创建的水印 观察事件流中的时间戳。所以除非你的 事件时间戳也基于增加类似计数器, 这可以解释你所看到的一些行为

另一个问题是,虽然每个 事件,在定期水印赋值器中使用getCurrentWatermark方法 在单独的线程中每200毫秒调用一次(默认情况下)。如果 您需要在每次事件后使用水印,您需要使用 带有标点水印的赋值器,尽管这样做有点像 反模式(因为有那么多水印会增加开销)

如果你的时间戳完全是人为的,你可能会发现
滑动计数窗口更自然地适合您所做的事情。

您的解释让我有点困惑。水印与时间戳相比如何?这与使用CountWindow有何不同?您好,David,水印在下一个事件时间发出,以标记流中不会再发生具有该事件时间的事件。这样做的目的是确保每个元素都被视为滑动窗口的单独事件。我想在元素上实现一个滑动窗口。