我试图了解原始状态和托管状态之间的区别。从文档中:
键控状态和操作员状态以两种形式存在:受管状态和原始状态。
受管状态在由 Flink运行时,例如内部哈希表或RocksDB。例子是 “ ValueState”,“ ListState”等。Flink的运行时对状态进行编码, 将它们写入检查点。
原始状态是操作员保留其自己的数据结构的状态。 当经过检查点时,它们仅将字节序列写入 检查点。 Flink对州的数据结构一无所知, 只能看到原始字节。
但是,我还没有找到突出差异的示例。任何人都可以提供一个最小的示例来使代码中的区别清楚吗?
答案 0 :(得分:1)
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。只要操作员可以自行恢复状态,状态就可以呈任意形状。
但是,巧合的是,在过去,许多操作员状态也已(重新)实现为受管状态。因此,实际上这条线更加模糊。