Flink从入门到实战八[State]-7-Flink Operator State 算子状态

Operator State(算子状态):在同一个算子上的状态,对当前算子的所有数据是共享的。
需要注意的是State需要支持重新分布,比如并行度发生变化,就需要支持重新分布。
我们一般业务开发中大部分情况如果使用有状态计算,都是使用Key State。Operator State它大都作为一种特殊类型的状态使用,例如用于实现 source/sink,以及无法对 state 进行分区而没有主键的这类场景中。

算子状态类型:
List state :数据存储为列表,恢复或因并行度变化需要从新分配状态数据时,按照任务节点均分
Union list state :数据存储为列表,恢复或因并行度变化需要从新分配状态数据时,将之前所有状态数据都分配到各个任务节点上

List state举例来说
当前例子初始并行度为3,每个实例中状态数据如下:

      func_1        func_2     func_3
   +----+----+   +----+----+   +----+
   | S1 | S2 |   | S3 | S4 |   | S5 |
   +----+----+   +----+----+   +----+
   

如果恢复时,将并行度设置为5,则状态数据分配如下:

   func_1   func_2   func_3   func_4   func_5
   +----+   +----+   +----+   +----+   +----+
   | S1 |   | S2 |   | S3 |   | S4 |   | S5 |
   +----+   +----+   +----+   +----+   +----+

如果恢复时,并行度设置为2,则状态数据分配如下:

        func_1          func_2
   +----+----+----+   +----+----+
   | S1 | S2 | S3 |   | S4 | S5 |
   +----+----+----+   +----+----+

Union list state举例来说
当前例子初始并行度为3,每个实例中状态数据如下:

      func_1        func_2     func_3
   +----+----+   +----+----+   +----+
   | S1 | S2 |   | S3 | S4 |   | S5 |
   +----+----+   +----+----+   +----+

如果恢复时,将并行度设置为2,则状态数据分配如下:

   func_1                          func_2 
   +----+----+----+----+----+      +----+----+----+----+----+
   | S1 | S2 | S3 | S4 | S5 |      | S1 | S2 | S3 | S4 | S5 |
   +----+----+----+----+----+      +----+----+----+----+----+

算子状态两种定义方式
实现CheckpointedFunction接口
实现ListCheckpointed接口

我们接下来演示这两种状态的使用方法。