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

时间:2019-11-30 09:12:18

标签: apache-flink

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

  

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

     

受管状态在由   Flink运行时,例如内部哈希表或RocksDB。例子是   “ ValueState”,“ ListState”等。Flink的运行时对状态进行编码,   将它们写入检查点。

     

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

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

1 个答案:

答案 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。只要操作员可以自行恢复状态,状态就可以呈任意形状。

但是,巧合的是,在过去,许多操作员状态也已(重新)实现为受管状态。因此,实际上这条线更加模糊。