【问题标题】:Detect end of event time session window (Apache Flink Java)检测事件时间会话窗口的结束(Apache Flink Java)
【发布时间】:2020-02-14 11:09:20
【问题描述】:

假设所有事件都准时到达并且不允许迟到,我如何仅在会话窗口结束时进行一些处理? IE。水印已通过 (lastEventInWindowTimestamp + inactivityGap)。 发生这种情况时,我找不到任何调用的 API 方法。我可以使用自定义的ProcessWindowFunction 来实现这个逻辑吗?

【问题讨论】:

    标签: java apache-flink streaming-analytics


    【解决方案1】:

    是的,ProcessWindowFunction 正是为此目的。当窗口完成时调用这样的函数,并传递(除其他外)一个包含已分配给窗口的流元素的 Iterable。在会话窗口的情况下,ProcessWindowFunction 直到经过非活动期后才会被调用。

    更新:如何报告每个会话窗口的开始和结束时间戳?

    我假设您可以从事件本身中提取每个事件的时间戳。然后,如果您使用ProcessWindowFunction,您可以遍历窗口中的事件并确定会话中事件的最小和最大时间戳——这些将是开始和结束时间戳。

    另一方面,如果您更愿意使用增量计算窗口结果的 reduce 函数,则可以使用跟踪每个窗口的 (min, max) 时间戳的元组。

    【讨论】:

    • 如果我想同时发出会话窗口的开始时间戳和结束时间戳怎么办?我目前正在使用自定义触发器来触发 ProcessWindowFunction,但我无法以这种方式检测到窗口结束。我看不到可以同时检测到两者的方法。
    • 澄清一下:在实际窗口大于 MIN_WINDOW_SIZE(即 lastEventTimestamp - firstEventTimestamp > MIN_WINDOW_SIZE)后,我的自定义触发器输出“window started @ timestamp”。我还想在会话结束时输出“窗口停止@时间戳”。
    • 回复更新:窗口结束时不会给我时间戳,对吧?新事件可能会更改此值。我只想在会话窗口关闭时发出“窗口结束”消息,并且不能向该窗口添加更多事件(即水印通过 windowEnd + inactivityPeriod)。抱歉,如果我之前没有说清楚。
    • 通常,直到水印通过窗口结束后才会调用 ProcessWindowFunction,其中包括会话窗口情况下的间隙。如果没有允许的延迟,ProcessWindowFunction 只会被调用一次;不会添加更多事件。您的自定义触发器是否多次触发窗口?
    • 看来您的问题实际上是关于如何实现会话窗口,其中会话的活动部分具有最短持续时间。这与您在上面提出的问题完全不同,这是我不准备回答的问题。但是,我认为正确执行此操作需要的不仅仅是自定义触发器,因为在我看来,您必须以某种方式说服 MergingWindowAssigner 有时合并比间隙更远的会话(通常不会这样做)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2018-03-08
    相关资源
    最近更新 更多