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

标签 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 都应该创建自己的窗口,即 a 事件的 Window(a)Window(b)b 事件等,因为据我了解,Flink 使用 Window 实例来关联相应的事件,即所有 a 事件都应与 Window(a) 例如。在这种情况下,只有与 Window(a) 关联的所有 a 事件将被传递到窗口函数并一起处理(在本例中将计算按 ID 分组的事件计数,即由 ab 等),但如您所见,此示例使用 GlobalWindow 的一个实例。

最佳答案

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

更准确地说,内部有一个嵌套的 Map<Window, Map<Key, List<Element>>其中存储每对 WindowKey List 中的元素.

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

关于apache-flink - 为什么只使用一个 GlobalWindow 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36305123/

相关文章:

apache-flink - 选择所有字段为json字符串作为Flink SQL中的新字段

java - 在 Apache Flink 中手动更新状态的最佳方式是什么?

hadoop - flink-sql 如何处理 'count(distinct )' 这样的场景

apache-flink - Flink - 当没有以下事件时发出最后一个窗口

hadoop - Apache Flink AWS S3 Sink 是否需要 Hadoop 进行本地测试?

apache-flink - flink key通过添加延迟;我怎样才能减少这个延迟?

hadoop - 无法将点/检查点flink状态保存到AWS S3存储桶

java - 弗林克 : no suitable method found for process

java - Flink 中的局部变量

java - 如何将Apache flink连接到rabbitmq?