Flink 状态的类型

300 阅读3分钟

Managed State & Raw State

按照管理方式,Flink 将 状态分为 Managed StateRaw State ,两者的区别如下

  • 管理方式
    • Managed StateFlink Runtime 管理,自动存储、自动恢复、在内存管理上有优化。(Checkpoint 、Savepoint 保存的就是该类型的状态)
    • Raw State 需要用户自己管理,需要自己序列化 (无法使用 Flink Checkpoint 、Savepoint 机制,需要自己实现状态容错及恢复)
  • 支持的数据结构
    • Managed State 支持已知的数据结构,如 Value、List、Map 等。
    • Raw State 只支持字节数组 ,所有状态数据都要转换为二进制字节数组存储
  • 使用场景
    • Managed State 适用于大多数业务场景
    • Raw State 仅当 Managed State 不够用时,比如需要自定义 Operator 时,才推荐使用 Raw State

6-3-1024x575.png

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 需要自己实现 CheckpointedFunctionListCheckpointed 接口

支持的数据结构

  • Keyed State
    • ValueState : 类型为 T 的单值状态,这个状态与对应的 Key 绑定,最简单的状态,通过 update 方法更新值,通过 value 方法获取值
    • ListState : Key 上的状态值为一个列表,这个列表可以通过 add 方法往列表中添加值,也可以通过 get() 方法返回一个 Iterable<T>来遍历状态值
    • ReducingState : 每次调用 add() 方法添加值的时候,会调用用户传入的 reduceFunction,最后合并到一个单一的状态值
    • MapState<UK, UV> : 状态值为一个Map,用户通过 putputAll 方法添加元素,get(key) 通过指定的 key 获取 value,使用 entries()keys()values()检索
    • AggregatingState<IN, OUT> : 保留一个单值,表示添加到状态的所有值的聚合。和 ReducingState 相反的是, 聚合类型可能与添加到状态的元素的类型不同。使用 add(IN) 添加的元素会调用用户指定的 AggregateFunction 进行聚合
    • FoldingState<T, ACC> : 已过时!建议使用AggregatingState 保留一个单值,表示添加到状态的所有值的聚合。 与 ReducingState 相反,聚合类型可能与添加到状态的元素类型不同。 使用add(T)添加的元素会调用用户指定的 FoldFunction 折叠成聚合值
  • Operator State
    • ListState

几种 State 数据结构之间的关系

8-1-1024x574.png