ProcessWindowFunction 中的 Apache Flink 状态

Dan*_*iel 3 apache-flink

我尝试了解 ProcessWindowFunction 中可以使用的各种状态的差异。

首先,ProcessWindowFunction是一个AbstractRichFunction

abstract class ProcessWindowFunction[IN, OUT, KEY, W <: Window]
    extends AbstractRichFunction {...}
Run Code Online (Sandbox Code Playgroud)

因此它可以使用该方法

public RuntimeContext getRuntimeContext() 
Run Code Online (Sandbox Code Playgroud)

获得一个状态

getRuntimeContext().getState
Run Code Online (Sandbox Code Playgroud)

更多,WindowProcessFunction的处理函数

def process(key: KEY, context: Context, elements: Iterable[IN], out: 
    Collector[OUT]) {}
Run Code Online (Sandbox Code Playgroud)

有一个上下文,其中又有两种方法允许我获取状态:

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

/**
  * State accessor for per-key global state.
  */
def globalState: KeyedStateStore
Run Code Online (Sandbox Code Playgroud)

这是我的问题:

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

2)我经常使用自定义触发器实现和全局窗口。在这种情况下,使用 getPartitionedState 检索状态。我可以在触发函数中访问 WindowProcessFunction 中定义的窗口状态吗?如果是这样怎么办?

3)Trigger类中没有可以重写的open方法,状态创建是如何处理的?只调用 getPartitionedState 是否安全,它还管理状态创建?

Pio*_*ski 5

  1. 列表项getRuntimeContext().getState调用globalState相当于ProcessWindowFunction.Context. 两者都是“全局”状态,与 的“窗口”状态相反windowState。“全局”意味着状态在具有相同密钥的所有窗口之间共享。windowState每个窗口都是独立的,即使对于相同的密钥也是如此。请记住,即使是“全局”状态也不会在不同的键之间共享。
  2. 在我看来,TriggerContext#getPartitionedState()和 都ProcessWindowFunction.Context#globalState()指向同一件事。
  3. 根据代码和我发现的一个示例 ( org.apache.flink.table.runtime.triggers.StateCleaningCountTrigger):是的,getPartitionedState()如果之前未创建状态,则应该处理状态的创建。