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

Apache flink 原始状态与托管状态的示例,apache-flink,Apache Flink,我试图理解原始状态和托管状态之间的区别。从文档中: 键控状态和运算符状态以两种形式存在:托管和原始 托管状态在由控制的数据结构中表示 Flink运行时,如内部哈希表或RocksDB。例如 “ValueState”、“ListState”等。Flink的运行时对状态和状态进行编码 将它们写入检查点 原始状态是运算符保存在自己的数据结构中的状态。 当设置检查点时,它们只将字节序列写入 检查站。弗林克对该州的数据结构和 只看到原始字节 然而,我没有发现任何突出这种差异的例子。有谁能提供一个简单的例子来

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

键控状态和运算符状态以两种形式存在:托管和原始

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

原始状态是运算符保存在自己的数据结构中的状态。 当设置检查点时,它们只将字节序列写入 检查站。弗林克对该州的数据结构和 只看到原始字节


然而,我没有发现任何突出这种差异的例子。有谁能提供一个简单的例子来说明代码中的区别吗?

运算符状态仅用于运算符API,它仅适用于高级用户,并且不如最终用户API稳定,这就是为什么我们很少宣传它的原因。 作为一个例子,考虑,它代表一个带有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。只要操作符能够自行恢复状态,状态就可以具有任意形状


然而,巧合的是,在过去,许多操作符状态也被(重新)实现为托管状态。所以事实上这条线更模糊。

非常感谢阿维德。我猜当你在回答中提到操作员状态时,你指的是原始(操作员)状态,因为我的问题是关于原始/托管状态之间的区别。为了进一步阐明您的观点,您是否可以提供一个到操作符API的链接,或者到使用原始操作符状态的一些简单示例的链接?不幸的是,我仍然不清楚这在代码中是什么样子的(到目前为止,我在文档中找到的所有示例仅适用于托管状态)。链接已经是示例:如果实现自己的操作符,则使用操作符API。例如,如果您认为自己的连接比默认实现更好,Flink允许您实现自己的连接。对于此运算符,可以序列化任何需要的内容。但是在UDF内部,你需要坚持托管状态。而且,我认为目前Flink的文档在这方面有点欠缺。如果我错了,请纠正我,但Fabian Hueske和Vasiliki Kalavri的《使用Apache Flink进行流处理:流应用程序的基本原理、实现和操作》一书中也没有任何示例。我发现,这也涉及到原始状态和托管状态之间的差异。我不确定是否有示例,但我对此表示怀疑。原始状态实际上或多或少是用于内部使用的。超级用户如果想要实现自己的运营商,也可以利用这一点。