1.状态的概念
流式计算中分为无状态和有状态两种情况:
1.无状态是计算观察每个独立的事件,并根据最后一个事件输出结果。
2.有状态的计算则会基于多个事件输出结果
2.状态的分类
1.算子状态(operator state)
作用的范围限定为算子任务,同一并行的任务所处理的所有数据都可以访问到相同的状态,状态对于同一任务而言是共享的。算子状态提供了三种基本的数据结构:
1.列表状态(List State)
将状态表示为一组数据的列表
2.联合列表状态(Union list state)
也是将状态表示为一个条目列表,与List State的区别是,在发生故障时或从保存点启动应用程序时,状态的回复方式不同
3.广播状态(Broadcast state)
如果一个算子有多项任务,而它的每项任务状态又都相同,那么这种特殊情况最适合应
用广播状态。
2.键控状态(keyed state)
根据输入数据流中定义的键(key)来进行维护或者访问的,flink为每个键都维护了一个实例状态,并将具有有相同键的所有数据,都分区到同一个算子任务中,这个任务会维护和处理这个 key 对应的状态。键控状态提供了以下几种数据类型:
1.ValueState[T]保存单个的值,值的类型为T
(1)get 操作: ValueState.value()
(2)set 操作: ValueState.update(value: T)
2.ListState[T]保存一个列表,列表里的元素的数据类型为T
ListState.add(value: T)
ListState.addAll(values: java.util.List[T])
ListState.get()返回 Iterable[T]
ListState.update(values: java.util.List[T])
3.MapState[K,V]保存K-V键值对
MapState.get(key: K)
MapState.put(key: K, value: V)
MapState.contains(key: K)
MapState.remove(key: K)
4.ReducingState[T]
5.AggregateState[I,O]