Flink学习笔记——Flink State
Flink有两种基本类型的状态:托管状态(Managed State)和原生状态(Raw State)。两者的区别:Managed State是由Flink管理的,Flink帮忙存储、恢复和优化,Raw State是开发者自己管理的,需要自己序列化。
Managed State |
Raw State |
|
状态管理方式 | Flink Runtime托管, 自动存储, 自动恢复, 自动伸缩 | 用户自己管理 |
状态数据结构 |
Flink提供多种常用数据结构, 例如:ListState, MapState等 | 字节数组: byte[] |
使用场景 |
绝大数Flink算子 | 所有算子 |
ListState使用案例:使用flink实现一个topN的程序
Managed State又有两种类型:Keyed State和Operator State。
在Flink 中,Keyed State 是绑定到数据流中的特定键(Key)的。 这意味着Flink 维护了数据流中每一个key 的状态。 当处理一个新的元素时,Flink 会将状态的键设置为该元素的键,然后调用对应的处理函数。 Keyed State 的一个典型应用场景是计算每个键的滚动聚合。参考:Flink系列 13. 介绍Flink中的Operator State 和 Keyed State
Operator State可以被所有的operators使用。它通常适用于source,例如FlinkKafkaConsumer。每个operator状态都绑定到一个并行operator实例。Kafka consumer的每个并行实例都维护着一个topic分区和offset的映射,作为它的operator状态。官方文档:https://nightlies.apache.org/flink/flink-docs-release-1.17/docs/dev/datastream/fault-tolerance/state/#operator-state
Operator State |
Keyed State |
|
适用算子类型 |
可用于所有算子: 常用于source, 例如 FlinkKafkaConsumer |
只适用于KeyedStream上的算子 |
状态分配 |
一个算子的子任务对应一个状态 |
一个Key对应一个State: 一个算子会处理多个Key, 则访问相应的多个State |
创建和访问方式 |
实现CheckpointedFunction或ListCheckpointed(已经过时)接口 |
重写RichFunction, 通过里面的RuntimeContext访问 |
横向扩展 |
并发改变时有多重重写分配方式可选: 均匀分配和合并后每个得到全量 | 并发改变, State随着Key在实例间迁移 |
支持的数据结构 | ListState和BroadCastState | ValueState, ListState,MapState ReduceState, AggregatingState |
参考:Apache Flink State Types 和 【Flink】Flink 状态管理
本文只发表于博客园和tonglin0325的博客,作者:tonglin0325,转载请注明原文链接:https://www.cnblogs.com/tonglin0325/p/5321236.html