apache-flink - ProcessWindowFunction 中的 Apache Flink 状态
问题描述
我试图了解可以在 ProcessWindowFunction 中使用的各种状态的差异。
首先,ProcessWindowFunction 是一个 AbstractRichFunction
abstract class ProcessWindowFunction[IN, OUT, KEY, W <: Window]
extends AbstractRichFunction {...}
因此它可以使用该方法
public RuntimeContext getRuntimeContext()
得到一个状态
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 中定义的窗口状态吗?如果有怎么办?
3)Trigger类中没有open方法可以覆盖,状态创建如何处理?只调用同时管理状态创建的 getPartitionedState 是否安全?
解决方案
- 列表项
getRuntimeContext().getState
调用等效于globalState
aProcessWindowFunction.Context
。两者都是“全局”状态,与windowState
. “全局”意味着状态在具有相同键的所有窗口之间共享。windowState
每个窗口都是独立的,即使对于同一个键也是如此。请记住,即使是“全局”状态也不会在不同的键之间共享。 - 在我看来,
TriggerContext#getPartitionedState()
并且ProcessWindowFunction.Context#globalState()
指向同一件事。 - 基于我发现的代码和一个示例(
org.apache.flink.table.runtime.triggers.StateCleaningCountTrigger
):是的,getPartitionedState()
如果之前没有创建状态,应该处理它的创建。
推荐阅读
- sql - 在 SQL Server 数据库的 1 个 BLOB 中存储多个 mp3 和 mp4 文件
- javascript - 将元素存储到对象中以用作单击处理程序无法正常工作(jQuery/javascript)
- eclipse - Spring Boot 无法识别对 kotlin 类的更改?
- c++ - “错误:'。'之前的预期主表达式 令牌”出现,我不知道为什么
- javascript - 在 bootstrap-4 中打开另一个时,手风琴不会缩回打开的部分
- sql-server - SSRS 报告给多值参数错误
- java - 我可以写一个没有“这个”字的课程吗
- python - 在python中使用xpath查询从以下节点中选择整个文本以及子节点
- spring-batch - 春季批处理表
- c# - 如何将 WPF 图像 + 形状刻录到新图像