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

时间:2016-03-30 09:45:06

标签: apache-flink flink-streaming

看看这个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(a)事件为aWindow(b)事件为b等,因为我了解Flink是使用Window的实例作为关联对应事件,例如,所有a事件应该与Window(a)相关联。在这种情况下,只有与a相关联的所有Window(a)事件将被传递到窗口函数并一起处理(在此示例中将计算按ID分组的事件的计数,即a,{{ 1}}等等,但正如您可以使用b的一个实例看到此示例。

1 个答案:

答案 0 :(得分:2)

Flink使用Window实例将属于同一窗口的元素分组在一起是正确的。但是,甚至在此之前,输入流根据指定的密钥进行分组。因此,内部Flink为每个键存储一个窗口列表及其相关元素。这允许跨多个键使用相同的窗口实例。

更准确地说,在内部,您有一个嵌套的Map<Window, Map<Key, List<Element>>,用于存储Window中每对KeyList的元素。

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