【问题标题】:Why is only one instance of GlobalWindow used?为什么只使用了一个 GlobalWindow 实例?
【发布时间】:2016-03-30 09:45:05
【问题描述】:

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

【问题讨论】:

    标签: apache-flink flink-streaming


    【解决方案1】:

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

    更准确地说,在内部你有一个嵌套的Map&lt;Window, Map&lt;Key, List&lt;Element&gt;&gt;,它为每对WindowKey 存储List 中的元素。

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

    【讨论】:

    • 来自 ci.apache.org/projects/flink/flink-docs-release-1.2/dev/… ,它说“全局窗口分配器将具有相同键的所有元素分配给同一个全局窗口。”,因此如果有 10 个不同的键,它将生成 10 个不同的键全局窗口?
    • 从语义上讲,每个键都有一个不同的窗口。在实现方面,窗口实例在所有键中都是相同的。原因是窗口实例与键值形成一个复合键来唯一标识窗口元素。
    • 这仅适用于全局 Windows,对吗?对于时间窗口,即使从实现的角度来看,10 个不同的键也会有 10 个不同的时间窗口实例,对吗?如果我错了,请纠正我。
    • 直到,我也有一个困惑,如果窗口实例在全局窗口的所有键中都是相同的,但是从实现方式来看,时间窗口的每个不同键的一个单独的窗口实例,为什么时间窗口不使用与全局窗口相同的策略?
    • 因为时间窗口被绑定到一个时间间隔(例如,如果你有每小时窗口,从 1:00 到 2:00)。
    猜你喜欢
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多