0

我正在使用 apache 梁来编写一些流式传输管道。我的用例的一个要求是我想相对于窗口开始或结束时间每 X 分钟触发一次。我怎么能做到这一点。当前触发器 AfterProcessingTime.pastFirstElementInPane() 与该窗口中第一个元素的处理时间有关。

例如,我创建了固定的 1 分钟窗口,所以我有 window_1(0-1 分钟间隔)、window_2(1 - 2 分钟间隔)等等。现在我希望每个窗口的结果在窗口开始后 10 分钟后恰好触发一次,即 window_1 在 0 + 10 -> 10 分钟,window_2 在第 11 分钟 (1 + 10)。[注意:我将固定窗口配置为允许延迟 > 10 分钟,因此如果延迟,元素不会被丢弃]

有没有办法为固定窗口实现这种触发。

我不能只是将所有元素分配给一个全局窗口,然后每分钟重复触发一次,因为这样它会丢失所有元素窗口时间信息。例如,如果我的 pcollection 中有 2 个元素属于 window_1 和 window_2 基于那里的事件时间戳,但延迟了 3 和 3.2 分钟。将它们分配给全局窗口将在第 4 分钟结束时生成一些输出,同时考虑到这两个元素,而实际上我希望将它们分配给实际的固定窗口(作为后期数据)。

我希望根据那里的事件时间戳将元素分配给 window_1 和 window_2,然后 window_1 在第 10 分钟触发输出结果,方法是仅处理该窗口的 1 个延迟数据,然后在第 11 分钟触发 window_2 并在处理唯一的元素后输出延迟了 3.2 分钟。在我的流媒体管道中实现这种行为的触发器设置应该是什么。

4

1 回答 1

0

我相信以下代码对您有用:

pcollection | WindowInto(
    FixedWindows(1 * 60).configure().withAllowedLateness(),
    trigger=AfterProcessingTime(9 * 60),

窗口大小为 1 分钟,9 分钟后触发数据。但是,在许多情况下,使用滑动窗口然后处理重复的处理元素要快得多。正如 AlexAmato 提到的那样,Watermarks 和 AfterWatermark 事件时间触发器也应该在这里工作。

于 2018-07-04T18:26:55.857 回答