首页 笔记 图片 查字 
所属分类:Flink
浏览:71
内容:

状态编程:计算过程中依赖其它数据就是状态编程。
无状态:无状态的计算观察每个独立事件,并根据最后一个事件输出结果。
有状态:有状态的计算则会基于多个事件输出结果。

状态分类:
托管状态(Managed State):由Flink的运行时(Runtime)来托管的。状态会自动持久化保存,发生故障时自动恢复。
原始状态(Raw State):由开发者自己管理的,需要自己序列化。

托管状态(Managed State)分为两种类型:
1、算子状态(operator state):
算子状态的作用范围限定在算子任务内。同一并行任务所处理的所有数据都可以共享到相同的状态,就是每个算子子任务或者说每个算子实例共享一个状态。

算子状态的三种基本数据结构:
列表状态(Liststate):当前并行子任务上所有状态项的集合。
联合列表状态(UnionListState):也会将状态表示为一个列表。
广播状态(BroadcastState):将状态完整的分发给所有子任务。

区别:
当并行度调整时,常规列表状态是轮询分配状态项,而联合列表状态的算子则会直接广播状态的完整列表。

2、键控状态(keyed state):
键控状态是根据输入数据流中定义的键(key)来维护和访问的,它的访问范围限定在当前输入的key。

键控状态的三种基本数据结构:
值状态(ValueState):状态中只保存一个值(value)。
列表状态(ListState):
映射状态(MapState):以键值对(key-value)的格式将状态保存起来。
归约状态(ReducingState):与值状态类似,需要对添加的所有数据进行归约,将归约聚合之后的值作为状态保存下来。
聚合状态(AggregatingState):与归约状态类似,聚合状态也是一个值。

区别:
聚合状态对不同数据类型进行聚合保存,更加灵活。
归约状态只能对相同数据类型进行聚合保存。