看看这个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 都应该创建自己的窗口,即 a
事件的 Window(a)
,Window(b)
的b
事件等,因为据我了解,Flink 使用 Window 实例来关联相应的事件,即所有 a
事件都应与 Window(a)
例如。在这种情况下,只有与 Window(a)
关联的所有 a
事件将被传递到窗口函数并一起处理(在本例中将计算按 ID 分组的事件计数,即由 a
、b
等),但如您所见,此示例使用 GlobalWindow
的一个实例。
最佳答案
Flink 使用 Window
是正确的将属于同一窗口的元素分组在一起的实例。然而,即使在此之前,输入流也是根据指定的键进行分组的。因此,Flink 在内部为每个键存储一个窗口列表及其关联元素。这允许跨多个键使用同一个窗口实例。
更准确地说,内部有一个嵌套的 Map<Window, Map<Key, List<Element>>
其中存储每对 Window
和Key
List
中的元素.
这种方法的好处是键控流和非键控流上的窗口逻辑的实现没有区别。对于后一种情况,您只需将 key 设置为虚拟值即可。
关于apache-flink - 为什么只使用一个 GlobalWindow 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36305123/