一、键控状态说明
参考官网说明,几个键控状态介绍如下:
- ValueState: 保存一个可以更新和检索的值(如上所述,每个值都对应到当前的输入数据的 key,因此算子接收到的每个 key 都可能对应一个值)。 这个值可以通过 update(T) 进行更新,通过 T value() 进行检索。
- ListState: 保存一个元素的列表。可以往这个列表中追加数据,并在当前的列表上进行检索。可以通过 add(T) 或者 addAll(List) 进行添加元素,通过 Iterable get() 获得整个列表。还可以通过 update(List) 覆盖当前的列表。
- ReducingState: 保存一个单值,表示添加到状态的所有值的聚合。接口与 ListState 类似,但使用 add(T) 增加元素,会使用提供的 ReduceFunction 进行聚合。
- AggregatingState<IN, OUT>: 保留一个单值,表示添加到状态的所有值的聚合。和 ReducingState 相反的是, 聚合类型可能与 添加到状态的元素的类型不同。 接口与 ListState 类似,但使用 add(IN) 添加的元素会用指定的 AggregateFunction 进行聚合。
- MapState<UK, UV>: 维护了一个映射列表。 你可以添加键值对到状态中,也可以获得反映当前所有映射的迭代器。使用 put(UK,UV) 或者 putAll(Map<UK,UV>) 添加映射。 使用 get(UK) 检索特定 key。 使用 entries(),keys() 和 values() 分别检索映射、键和值的可迭代视图。你还可以通过 isEmpty() 来判断是否包含任何键值对。
注意点:
- 所有的类型都有clear(), 清空当前key的状态。
- 这些状态对象仅用于用户与状态进行交互。
- 从状态获取的值与输入元素的key相关(keyby动作)。
- 状态不是必须存储到内存, 也可以存储在磁盘或者任意其他地方。
状态后端目前有三种状态:
MemoryStateBackend:内存级别,一般测试环境使用
FsStateBackend:本地状态在JobManager内存, Checkpoint存储在文件系统中,可应用于生成
RocksDBStateBackend:将所有的状态序列化之后, 存入本地的RocksDB数据库中.(一种NoSql数据库, KV形式存储),使用超大状态作业,对读写状态性能要求不高的作业
状态通过 RuntimeContext 进行访问,因此只能在 rich functions 中使用。RichFunction 中 RuntimeContext 提供如下方法:
- ValueState getState(ValueStateDescriptor)
- ReducingState getReducingState(ReducingStateDescriptor)
- ListState getListState(ListStateDescriptor)
- AggregatingState<IN, OUT> getAggregatingState(AggregatingStateDescriptor<IN, ACC, OUT>)
- MapState<UK, UV> getMapState(MapStateDescriptor<UK, UV>)
二、开发实例代码
基于流数据获取每个ID的平均水位
- 结果展示

- 代码部分
package com.test;
import bean.WaterSensor2;
import org.apache.flink.api.common.functions.AggregateFunction;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.common.state.AggregatingState;
import org.apache.flink.api.common.state.AggregatingStateDescriptor;
import org.apache.flink.api.common.typeinfo.Types;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.S

本文详细介绍了Apache Flink中不同类型的状态管理,包括ValueState、ListState、ReducingState、AggregatingState和MapState,并提供了基于流数据计算每个ID平均水位的开发实例。状态后端包括MemoryStateBackend、FsStateBackend和RocksDBStateBackend,而状态访问通过RuntimeContext在RichFunction中实现。文章还展示了如何使用自定义累加器优化AggregatingState的实现。
最低0.47元/天 解锁文章
1739

被折叠的 条评论
为什么被折叠?



