Flink中的状态管理

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]

猜你喜欢

转载自blog.csdn.net/weixin_48929324/article/details/117172676