首页 > 解决方案 > 原始状态与托管状态的示例

问题描述

我试图了解原始状态和托管状态之间的区别。从文档:

Keyed State 和 Operator State 以两种形式存在:托管和原始。

托管状态以 Flink 运行时控制的数据结构表示,例如内部哈希表或 RocksDB。例如“ValueState”、“ListState”等。Flink 的运行时对状态进行编码并将它们写入检查点。

原始状态是操作员保存在自己的数据结构中的状态。设置检查点时,它们仅将字节序列写入检查点。Flink 对状态的数据结构一无所知,只看到原始字节。

但是,我没有找到任何突出差异的示例。任何人都可以提供一个最小的例子来说明代码中的差异吗?

标签: apache-flink

解决方案


Operator 状态仅在 Operator API 中使用,仅适用于高级用户,它不如最终用户 API 稳定,这就是我们很少宣传它的原因。例如,考虑AbstractUdfStreamOperator,它表示具有 UDF 的运算符。对于检查点,需要保存 UDF 的状态并在恢复时恢复。

@Override
public void snapshotState(StateSnapshotContext context) throws Exception {
    super.snapshotState(context);
    StreamingFunctionUtils.snapshotFunctionState(context, getOperatorStateBackend(), userFunction);
}

@Override
public void initializeState(StateInitializationContext context) throws Exception {
    super.initializeState(context);
    StreamingFunctionUtils.restoreFunctionState(context, userFunction);
}

此时,状态可以被序列化为一个字节 blob。只要算子能够自行恢复状态,状态就可以采取任意形状。

然而,巧合的是,在过去,许多运营商状态也被(重新)实现为托管状态。所以这条线在现实中更加模糊。


推荐阅读