为什么只使用了一个 GlobalWindow 实例?

Why is only one instance of GlobalWindow used?

看看这个example:

// We create sessions for each id with max timeout of 3 time units
DataStream<Tuple3<String, Long, Integer>> aggregated = source
        .keyBy(0)
        .window(GlobalWindows.create())
        .trigger(new SessionTrigger(3L))
        .sum(2);

谁能解释一下为什么在这个例子中使用了一个 GlobalWindow 的实例(在 GlobalWindows#assignWindows 中创建)?

似乎对于任何传入的事件 ID 都应该创建自己的 window,即 Window(a) 用于 a 事件,Window(b) 用于 b 事件,等等。因为据我所知,Flink 正在使用 Window 的实例来关联对应的事件,即所有 a 事件都应该与 Window(a) 相关联。在这种情况下,只有与 Window(a) 关联的所有 a 事件将传递给 window 函数并一起处理(在此示例中,将计算按 ID 分组的事件计数,即按 a, b, 等等),但是正如您所看到的,这个示例使用了 GlobalWindow.

的一个实例

Flink 使用Window 个实例将属于相同window 的元素分组在一起是正确的。然而,即使在此之前,输入流也是根据指定的键进行分组的。因此,Flink 在内部为每个键存储了一个 windows 及其关联元素的列表。这允许跨多个键使用相同的 window 实例。

更准确地说,在内部你有一个嵌套的 Map<Window, Map<Key, List<Element>>,它为每对 WindowKey 存储 List.[=15 中的元素=]

这种方法的好处是 windowing 逻辑在键控流和非键控流上的实现没有区别。对于后一种情况,您只需将密钥设置为虚拟值即可。