ProcessWindowFunction

时间:2018-05-23 11:10:35

标签: apache-flink

我试着理解可以在ProcessWindowFunction中使用的各种状态的区别。

首先,ProcessWindowFunction是一个AbstractRichFunction

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

因此可以使用方法

public RuntimeContext getRuntimeContext() 

获得州

getRuntimeContext().getState

Morevoer,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)我经常使用自定义Trigger实现和GlobalWindow。在这种情况下,使用getPartitionedState检索状态。我是否也可以在触发器函数中访问WindowProcessFunction中定义的窗口状态?如果是这样的话?

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

1 个答案:

答案 0 :(得分:2)

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