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接口
我们接下来演示这两种状态的使用方法。