flink1.12.x State状态分类(Managed State、Raw State、Keyed State、Operator State)

状态类型

分为 托管状态(Managed State) 和 原生状态(Raw State)

托管状态(Managed State)

由Flink管理的,Flink帮忙存储、恢复和优化

提示:使用较多

原生状态(Raw State)

是开发者自己管理的,需要自己序列化

区别

状态管理的方式

  • Managed State由Flink Runtime托管,状态是自动存储、自动恢复的,Flink在存储管理和持久化上做了一些优化。当我们横向伸缩,或者说我们修改Flink应用的并行度时,状态也能自动重新分布到多个并行实例上。

  • Raw State是用户自定义的状态。

状态的数据结构

  • Managed State支持了一系列常见的数据结构,如:ValueState、ListState、MapState 等。

  • Raw State只支持字节,任何上层数据结构需要序列化为字节数组。使用时,需要用户自己序列化,以非常底层的字节数组形式存储,Flink并不知道存储的是什么样的数据结构。

使用场景

  • Managed State:绝大多数的算子都可以使用,通过继承 Rich函数类 或 其他提供好的接口

  • Raw State是在已有算子和Managed State不够用时,用户自定义算子时使用。

Managed State 分类

Managed State 分为 Keyed State 和 Operator State

Keyed State

Keyed State 是 KeyedStream 上的状态

如上图,进行 keyBy 分组,形成一个 KeyedStream ,数据流中所有 key 相同的数据 共享一个状态,可以 访问 和 更新 这个 状态

每个 Key 对应一个自己的状态

Operator State

可以用在所有算子上,每个算子子任务 或者说 每个算子实例 共享一个状态,流入这个算子子任务的数据可以 访问 和 更新 这个状态。

如下图:算子子任务1上的所有数据可以共享第一个Operator State,以此类推,每个算子子任务上的数据共享自己的状态。

存储

状态都是基于 本地的,即:每个算子子任务(或者说每个算子实例)维护着这个算子子任务对应的状态存储

算子子任务之间的 状态不能相互访问

参考:
https://www.cnblogs.com/sfzlstudy/p/16543985.html


原文出处:/show_1IX489rhEkA3.html