Managed State & Raw State
按照管理方式,Flink 将 状态分为 Managed State 和 Raw State ,两者的区别如下
- 管理方式
- Managed State 由 Flink Runtime 管理,自动存储、自动恢复、在内存管理上有优化。(Checkpoint 、Savepoint 保存的就是该类型的状态)
- Raw State 需要用户自己管理,需要自己序列化 (无法使用 Flink Checkpoint 、Savepoint 机制,需要自己实现状态容错及恢复)
- 支持的数据结构
- Managed State 支持已知的数据结构,如 Value、List、Map 等。
- Raw State 只支持字节数组 ,所有状态数据都要转换为二进制字节数组存储
- 使用场景
- Managed State 适用于大多数业务场景
- Raw State 仅当 Managed State 不够用时,比如需要自定义 Operator 时,才推荐使用 Raw State
Keyed State & Operator State
Managed State 是最常用的状态类型,具体又细分为两种,一种叫 Keyed State ,从名称就知道跟 key 相关。另外一种叫 Operator State,从名称就知道跟 Operator 相关。两者的区别如下:
- 可用于哪些 Operator
- Keyed State 只能用在 KeyedStream 流上的 Operator
- Operator State 可用于所有 Operator, 常用于 source 算子,例如
FlinkKafkaConsumer
State 对应关系
-
KeyedStream 流中的每种(注意,不是每个) key 对应一个Keyed State,一个 Keyed State 也只对应一种 key ,两者都是一对一的对应关系
- 如果 KeyedStream 流中多种 key 被分配到同一个 Operator 处理,则这个 Operator 可以访问这些 key 对应的 Keyed State,因此也可以不严谨的认为,一个 Operator 可能会对应多个 Keyed State (注意是可能会),但是一个 Keyed State 肯定是只对应一个 Operator
-
一个 Operator 对应一个 Operator State ,一个 Operator State 也只对应一个 Operator ,两者都是一对一的对应关系
并行度改变后
- Keyed State 随着 key 在实例间迁移
- Operator State 重新分配。有两种策略
- 合并所有 Operator State 后,均匀分配 Operator State 到每一个 Operator
- 合并所有 Operator State 后,全量分配到每一个 Operator
访问方式
- Keyed State 需要通过 RuntimeContext 访问
- Operator State 需要自己实现
CheckpointedFunction
或ListCheckpointed
接口
支持的数据结构
- Keyed State
- ValueState : 类型为 T 的单值状态,这个状态与对应的 Key 绑定,最简单的状态,通过
update
方法更新值,通过value
方法获取值 - ListState : Key 上的状态值为一个列表,这个列表可以通过
add
方法往列表中添加值,也可以通过get()
方法返回一个Iterable<T>
来遍历状态值 - ReducingState : 每次调用
add()
方法添加值的时候,会调用用户传入的reduceFunction
,最后合并到一个单一的状态值 - MapState<UK, UV> : 状态值为一个Map,用户通过
put
或putAll
方法添加元素,get(key)
通过指定的 key 获取 value,使用entries()
、keys()
、values()
检索 - AggregatingState
<IN, OUT>
: 保留一个单值,表示添加到状态的所有值的聚合。和ReducingState
相反的是, 聚合类型可能与添加到状态的元素的类型不同。使用add(IN)
添加的元素会调用用户指定的AggregateFunction
进行聚合 - FoldingState<T, ACC> : 已过时!建议使用AggregatingState 保留一个单值,表示添加到状态的所有值的聚合。 与
ReducingState
相反,聚合类型可能与添加到状态的元素类型不同。 使用add(T)
添加的元素会调用用户指定的FoldFunction
折叠成聚合值
- ValueState : 类型为 T 的单值状态,这个状态与对应的 Key 绑定,最简单的状态,通过
- Operator State
- ListState