在Flink架构体系中,有状态计算是Flink非常重要的特性之一,有状态计算是指在程序计算过程中,在Flink程序内部存储计算的中间结果,并提供给后续Function或者计算结果使用。状态数据可以维系在本地存储中,这里的存储可以是Flink的堆内存或者堆外内存,或者第三方介质,如:Flink中的RocksDB.
Flink状态类型及应用
状态类型
在Flink中根据数据集是否根据Key进行分区,将状态分为Keyed State 和 Operator State(Non-keyed State)两种类型。
(1)Keyed State
表示和Key相关的一种State,只能用于KeydStream类型数据集对应的Functions和 Operators之上。Keyed State是 Operator State的特例,区别在于 Keyed State 事先按照key对数据集进行了分区,每个 Key State 1仅对应ー个 Operator和Key的组合。Keyed State可以通过 Key Groups 进行管理,主要用于当算子并行度发生变化时,自动重新分布Keyed State数据。在系统运行过程中,一个Keyed算子实例可能运行一个或者多个Key Groups的keys。
(2)Operator State
与 Keyed State不同的是, Operator State只和并行的算子实例绑定,和数据元素中的key无关,每个算子实例中持有所有数据元素中的一部分状态数据。Operator State支持当算子实例并行度发生变化时自动重新分配状态数据。
同时在 Flink中 Keyed State和 Operator State均具有两种形式,其中一种为托管状态( Managed State)形式,由 Flink Runtime中控制和管理状态数据,并将状态数据转换成为内存 Hash tables或 ROCKSDB的对象存储,然后将这些状态数据通过内部的接口持久化到 Checkpoints 中,任务异常时可以通过这些状态数据恢复任务。另外一种是原生状态(Raw State)形式,由算子自己管理数据结构,当触发 Checkpoint过程中, Flink并不知道状态数据内部的数据结构,只是将数据转换成bys数据存储在 Checkpoints中,当从Checkpoints恢复任务时,算子自己再反序列化出状态的数据结构。Datastream API支持使用 Managed State和 Raw State两种状态形式,在 Flink中推荐用户使用 Managed State管理状态数据,主要原因是 Managed State f能够更好地支持状态数据的重平衡以及更加完善的内存管理。
领取专属 10元无门槛券
私享最新 技术干货