globalwindows在flink的同一globalwindows中分配具有相同键的元素?

vq8itlhq  于 2021-06-25  发布在  Flink
关注(0)|答案(1)|浏览(299)

根据下面的文档“全局窗口赋值器将具有相同键的所有元素分配给同一个全局窗口”
https://ci.apache.org/projects/flink/flink-docs-release-1.2/dev/windows.html
然后我检查了源代码,发现globalwindows的assignwindows方法只返回全局窗口,没有对parameter元素做任何操作,那么所有具有相同键的元素怎么会指向同一个全局窗口呢?
https://github.com/apache/flink/blob/12b4185c6c09101b64e12a84c33dc4d28f95cff9/flink-streaming-java/src/main/java/org/apache/flink/streaming/api/windowing/assigners/globalwindows.java

@Override
public Collection<GlobalWindow> assignWindows(Object element, long timestamp, WindowAssignerContext context) {
    return Collections.singletonList(GlobalWindow.get());
}
cunj1qz1

cunj1qz11#

在flink中,Windows和钥匙基本上是相互独立的。流元素可以按键和窗口分组,这些是正交维度(当我们要讨论窗口与键的组合时,这称为窗格。)
窗口示例没有键,窗口赋值器也没有。相反,键和键分区状态是计算窗口的运行时上下文的一部分。
当我试图理解键与窗口赋值器的关系时,我发现通读windowoperator的processelement实现很有帮助。当每个流元素到达窗口操作符时调用此代码。注意到钥匙的作用,同时忽略了很多其他细节,我们看到:

public void processElement(StreamRecord<IN> element) throws Exception {
    final Collection<W> elementWindows = windowAssigner.assignWindows(
        element.getValue(), element.getTimestamp(), windowAssignerContext);

    ...

    final K key = this.<K>getKeyedStateBackend().getCurrentKey();

    ...

    for (W window: elementWindows) {

        ...

        windowState.add(element.getValue());

        triggerContext.key = key;
        triggerContext.window = window;

        TriggerResult triggerResult = triggerContext.onElement(element);
        if (triggerResult.isFire()) {
            ...
            emitWindowContents(window, contents);
        }

        ...
    }
}

在这里,您可以看到通过getkeyedstatebackend()窗口操作符可以使用该键,但是直到从窗口赋值器获取该元素的窗口之后,才能检索到该键。窗口分配程序执行其工作时不需要考虑任何键。
不过,稍后会提取密钥,以便触发器可以通过触发器上下文使用它。

相关问题