原始状态与托管状态的示例



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

键控状态和操作员状态以两种形式存在:托管状态和原始状态。

托管状态在由 Flink 运行时,例如内部哈希表或 RocksDB。例如 "ValueState"、"ListState"等Flink 的运行时对状态和 将它们写入检查点。

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

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

运算符状态仅用于仅适用于高级用户的操作员 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。只要操作员可以自行恢复状态,状态就可以采用任意形状。

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

相关内容

  • 没有找到相关文章

最新更新