Apache flink ProcessWindowFunction中的Apache Flink状态

Apache flink ProcessWindowFunction中的Apache Flink状态,apache-flink,Apache Flink,我试图理解ProcessWindowFunction中可以使用的各种状态的差异 首先,ProcessWindowFunction是一个AbstractRichFunction abstract class ProcessWindowFunction[IN, OUT, KEY, W <: Window] extends AbstractRichFunction {...} 获得状态 getRuntimeContext().getState 此外,WindowProcessFunc

我试图理解ProcessWindowFunction中可以使用的各种状态的差异

首先,ProcessWindowFunction是一个AbstractRichFunction

abstract class ProcessWindowFunction[IN, OUT, KEY, W <: Window]
    extends AbstractRichFunction {...}
获得状态

getRuntimeContext().getState
此外,WindowProcessFunction的处理函数

def process(key: KEY, context: Context, elements: Iterable[IN], out: 
    Collector[OUT]) {}
有一个上下文,其中有两个方法允许我获取状态:

/**
  * State accessor for per-key and per-window state.
  */
def windowState: KeyedStateStore

/**
  * State accessor for per-key global state.
  */
def globalState: KeyedStateStore
以下是我的问题:

1) 这些与getRuntimeContext().getState有什么关系

2) 我经常使用自定义触发器实现和GlobalWindow。在本例中,使用getPartitionedState检索状态。我是否可以访问WindowProcessFunction中定义的窗口状态以及trigger函数中定义的窗口状态?如果是,怎么做

3) 触发器类中没有要重写的打开方法,如何处理状态创建?只调用getPartitionedState安全吗?getPartitionedState也管理状态创建

  • 列表项
    getRuntimeContext().getState
    调用相当于
    ProcessWindowFunction.Context的
    globalState
    。两者都是“全局”状态,而不是
    windowState
    的“窗口”状态。“全局”表示状态在具有相同密钥的所有窗口中共享<代码>窗口状态
    在每个窗口中都是独立的,即使对于同一个键也是如此。请记住,即使是“全局”状态也不会在不同的键之间共享
  • 在我看来,
    TriggerContext#getPartitionedState()
    ProcessWindowFunction.Context#globalState()
    指向同一件事
  • 根据我找到的代码和一个示例(
    org.apache.flink.table.runtime.triggers.StateCleaningCountTrigger
    ):是的,
    getPartitionedState()
    应该处理状态的创建,如果它以前没有创建过
  • /**
      * State accessor for per-key and per-window state.
      */
    def windowState: KeyedStateStore
    
    /**
      * State accessor for per-key global state.
      */
    def globalState: KeyedStateStore