Apache flink 如何使用具有时间戳和水印赋值器的Flink streaming timeWindow?

Apache flink 如何使用具有时间戳和水印赋值器的Flink streaming timeWindow?,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我正在开发一个Flink流媒体处理器,它可以读取卡夫卡的事件。这些事件由其中一个字段键入,在减少和输出之前,应在一段时间内打开窗口。我的处理器使用事件时间作为时间特征,因此从它使用的事件中读取时间戳。以下是它当前的样子: source .map(new MapEvent()) .assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<Event>(Time.seconds(10

我正在开发一个Flink流媒体处理器,它可以读取卡夫卡的事件。这些事件由其中一个字段键入,在减少和输出之前,应在一段时间内打开窗口。我的处理器使用事件时间作为时间特征,因此从它使用的事件中读取时间戳。以下是它当前的样子:

source
    .map(new MapEvent())
    .assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<Event>(Time.seconds(10)) {
        @Override public long extractTimestamp(Event event) {
                return event.getTimestamp();
            }
        })
    .keyBy(new KeySelector())
    .timeWindow(Time.minutes(1))
    .reduce(new EventReducer())
    .map(new MapToResult());
源代码
.map(新的MapEvent())
.assignTimestampsAndWatermarks(新的BoundedAutofordernessTimestampExtractor(时间.秒(10)){
@重写公共长提取时间戳(事件){
return event.getTimestamp();
}
})
.keyBy(新的KeySelector())
.时间窗口(时间.分钟(1))
.reduce(新的EventReducer())
.map(新的MapToResult());
我对这些活动的了解如下:

  • 他们在活动时间上是无序的
  • 晚到是可能的,因此事件可能比时间戳所说的要晚得多。为了便于使用,假设我知道,最新的可能到达时间为20秒
  • 我希望在Flink将我的活动转发到下面的reduce操作符之前,将其窗口化整整一分钟
  • 最后,这里是我的问题:

  • 鉴于我之前描述的用例,
    boundedAutofordernessTimestampExtractor
    是一个好的选择吗?我阅读了文档,看到了带有标点水印的
    赋值器
    和其他可用于创建水印的预定义赋值器,但没有完全理解,如果这些对我来说更好的话
  • assignTimestampsAndWatermarks()
    如何与
    timeWindow()方法配合使用?他们能在迟到时干涉吗?在这方面有什么我必须记住的吗

  • 我认为我们应该从水印的概念开始。简单地说,watermark表示,大多数具有较早时间戳的事件已经到达。基于该假设,当水印通过窗口的末尾时,时间窗口可以发出窗口。当然,仍然可能会有迟到的情况发生,这可能是我们需要处理的。下面是一个概念,它指定了在发出窗口后,我们应该跟踪存在的元素多长时间,以便我们可以使用这些延迟事件更新接收器(但必须记住,窗口已在没有此元素的情况下发出)。希望这能回答你第二个问题

    回到您的第一个问题,如果您有许多事件可能延迟20秒,我认为
    BoundedAutofordernessTimestampExtractor
    是最佳选择。通过这种方式,每个窗口的发射将延迟20秒。如果晚到的比较零散,你可以处理重复的,那么你可以考虑另一个

    如文档所述,如果流中的某些特定事件已经充当水印,则应使用您提到的带有标点水印的
    赋值器。所以不要认为它适合您的用例


    有关水印的详细信息,您可以阅读此信息,或者

    您的水印始终小于窗口结束时间,因此不会触发窗口以产生结果。如何触发窗口的要点如下:

  • 水印>=窗口结束时间
  • 此窗口中有一些元素

  • 谢谢,这有助于理解这两件事是如何协同工作的。好的,我在实现方面取得了一些进展,还编写了一些测试来检查延迟和窗口提取。这些测试行为怪异,因为它们产生了不可复制的结果。也许我还缺少什么。以下是我在测试中所做的。我首先创建一组实体,其事件时间正好适合一个时间窗口(1分钟)。然后我创建另一个实体,它是late(在窗口和允许的lateness之外)。之后,我再次从第一步创建完全相同的事件(相同的事件时间),并将它们发送给flink。结果因运行而异。至于结果的正确性,我需要看一些例子。但是由于随机性,我怀疑您没有在
    StreamExecutionEnvironment
    上启用
    TimeCharacteristic.EventTime
    ,是吗?我已将其设置为
    TimeCharacteristic.EventTime
    ,问题是
    ExecutionConfig.setAutoWatermarkInterval(…)
    的标准设置。根据Flink调用
    getCurrentWatermark
    的时间跨度,窗口关闭的方式不同,从而导致不同的结果。