GlobalWindows在Flink的同一GlobalWindows中分配了具有相同密钥的元素



基于下面的文档"全局窗口分配程序分配了所有元素,并将同一键的所有元素分配给同一单个全局窗口"

https://ci.apache.org/projects/flink/flink/flink-docs-reale-1.2/dev/windows.html

然后,我检查了源代码并找到了GlobalWindows的AndigtWindows方法,只需返回全局窗口而没有为参数元素做任何事情,那么如何使用相同键的所有元素到相同的单个全局窗口?

https://github.com/apache/flink/blob/12b4185c6c09101b64e12a84c33dc4d28f95cff95cff9/flink-streaming-java/streaming-java/sreaming-sreaming-sreaming-src/main/main/java/java/java/java/java/java/java/java一下P>

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

在flink中,窗口和钥匙在很大程度上彼此独立。流元素可以按键和窗口分组,这些元素是正交的维度。(当我们想谈论窗口与键的组合时,这称为 pane 。(

窗口实例没有键,窗口分配程序也不。相反,密钥和密钥分区状态是评估Windows的运行时上下文的一部分。

当我试图了解密钥与窗口分配程序之间的关系时,我发现阅读Windowerator的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((可用于窗口运营商,但是直到从窗口分配程序中获取此元素的窗口后才能检索到键。窗口分配者在不关心密钥的情况下完成工作。

键后来被获取,以便可以通过触发上下文将其提供给触发器。

相关内容

  • 没有找到相关文章

最新更新