apache-flink - 原始状态与托管状态的示例
问题描述
我试图了解原始状态和托管状态之间的区别。从文档:
Keyed State 和 Operator State 以两种形式存在:托管和原始。
托管状态以 Flink 运行时控制的数据结构表示,例如内部哈希表或 RocksDB。例如“ValueState”、“ListState”等。Flink 的运行时对状态进行编码并将它们写入检查点。
原始状态是操作员保存在自己的数据结构中的状态。设置检查点时,它们仅将字节序列写入检查点。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。只要算子能够自行恢复状态,状态就可以采取任意形状。
然而,巧合的是,在过去,许多运营商状态也被(重新)实现为托管状态。所以这条线在现实中更加模糊。
推荐阅读
- python - Python Cerberus 在模式中嵌入数字配置数据
- java - How to write Java Array string to Json File
- css - 如何为内容创建带有箭头和分隔符的 div,以便它们使用 react 和 css 对齐?
- excel - 如何根据Excel中同一行的另一个单元格中存在的值递归计算值的平均值
- angular - 如何在 Angular 中使用 SharedWorker?
- typescript - Webpack 缩短属性名称
- excel - 将文件名中的值替换为 Excel 工作表中的其他值
- java - Log4j2 中的功能级别可配置记录器启用
- html - 具有纯色圆形背景的图像
- tensorflow - 一个实例有多个 GPU 或多个实例有一个 GPU