Flink——状态编程
流式计算分为 无状态 和 有状态 两种情况。
无状态流处理:接收数据,根据最新输入数据生成输出数据
有状态流处理:维护状态(根据每条输入记录进行更新),并基于最新输入的记录和当前的状态值生成输出记录
有状态的算子和应用程序:状态始终与特定算子关联,有两种类型状态
算子状态(operator state):
作用范围限定为 算子任务。状态对同一任务而言是共享的,同一并行任务处理的所有数据都可以访问到相同的状态。算子状态不能由相同或不同算子的另一个任务访问。有三种基本数据结构:
列表状态(List state):将状态表示为一组数据的列表
联合列表状态(Union list state):与常规列表状态类似,发生故障时或保存点启动应用程序恢复方法不同
广播状态(Broadcast state):适用一个算子有多个任务且任务状态相同。
键控状态(keyed state):
根据输入数据流中定义的键(key)来维护和访问。每个键值维护一个状态实例,并将相同键的所有数据分到同一个算子任务中,类似于一个分布式的 key-value-map 数据结构,相同的key的所有数据都会访问相同的状态,只能用于 KeyedStream。支持以下数据类型:
ValueState<T>:保存单个值
get操作:ValueState.value()
set操作:ValueState.update(T value)
ListState<T>:保存列表
ListState.add(T value)
ListState.addAll(List<T> values)
ListState.get()
ListState.update(List<T> values)
MapState<K, V>:保存 key-value 对。
MapState.get(UK key)
MapState.put(UK key, UV value)
MapState.contains(UK key)
MapState,remove(UK key)
ReducingState<T>
AggregatingState<I, O>
可以使用 clear 清空状态。

浙公网安备 33010602011771号