状态类型
分为 托管状态(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

