目录
状态运行:
本文档介绍了在开发应用程序时如何使用Flink的状态抽象。
被Keys化状态和算子状态:
Flink有两种基本的状态:Keyed State和Operator State。
被Keys化状态:
被Keys化状态始终与键相关,只能在a上的函数和算子中使用KeyedStream,
您可以将Keyed State视为已分区或者分片的算子状态,每个Keys只有一个状态分区。每个被Keys化状态在逻辑上绑定到<parallel-operator-instance,key>的唯一复合,并且由于每个键“属于”一个被Keys化的算子的一个并行示例,我们可以将其简单的视为<operator,key>。
被Keys化状态进一步组织成所谓的Keys组。Keys组是Flink可以重新分配Keys状态的原子单元;Keys组与定义的最大并行度完全一样多.在执行期间,被Keys化 算子的每个并行实例都使用一个或多个Keys组的Keys。
算子状态;
使用算子状态(或非被Keys化状态),每个算子状态都绑定到一个并行算子实例。在Kafka连接器是在Flink使用运营状况的一个很好的激励的例子。Kafka使用者的每个实例都将主题分区和偏移的映射维护为其算子状态。
算子状态接口支持在并行性更改时在并行算子实例之间重新分配状态。可以有不通过的方案来进行此重新分配。
原始和托管状态:
被Keys化状态和算子状态有两种形式:托管状态和原始状态。
托管状态由Flink运行时控制的数据结构表示,例如内部哈希表或RocksDB。例如“VlaueState”,“ListState”等。Flink的运行时对状态进行编码并将它们写入检查点。
原始状态时算子保存自己的数据结构中的状态,检查点时,它们只会讲一个字节序列写入检查点。Flink对状态的数据结构一无所知,只看到原始字节。
所有数据流函数都可以使用托管状态,当原始状态接口只能则在实现算子时使用。建议使用托管状态(而不是原始状态),因为在托管状态下,Flink能够在并行性更改时自动重新分配状态,并且还可以进行更好的内存管理。
注意:如果您的托管状态需要自定义序列化逻辑请参与相应的指南以确保间来的兼容性。Flink的默认序列化器不需要特殊处理。
Keys化使用托管状态:
托管被Keys化状态接口提供对不同类型状态的访问,这些状态都限定为当前输入数据元的键。这意味着这种类型的状态只能用于a KeyedStream,可以通过创建stream.KeyBy(...)。
现在,我们讲首先查看可用的不同类型的状态,然后我们将看到他们如何则在程序中使用。可用的状态原语是:
VlaueState
未完,待续。。。