Apache Flink States in ProcessWindowFunction



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

首先,ProcessWindowFunction 是一个 AbstractRichFunction

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

因此,它可以使用

public RuntimeContext getRuntimeContext() 

获取状态

getRuntimeContext().getState

此外,窗口处理函数的处理函数

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(我经常使用自定义触发器实现和全局窗口。在这种情况下,使用 getPartitionedState 检索状态。我是否可以在触发器函数中访问在窗口进程函数中定义的窗口状态?如果是这样,怎么办?

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

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

相关内容

  • 没有找到相关文章

最新更新