flink系列(10)-状态State和状态描述StateDescriptor

  • 2019 年 10 月 4 日
  • 筆記

1. state的整个继承图如下

2.

InternalKVState 提供了只对 Flink 引擎暴露的接口比如 namespace set/get、val get、namespace merging,这些接口并不稳定,Flink 引擎希望对上层应用屏蔽,而通过 State 接口暴露出来的方法普通用户是可以使用的。

用户拿到 InternalKVState 的具体实现 HeapXXXState/RocksDBXXXState 后,便可以对背后的存储进行状态读写

2.1内部状态接口

2.2面向用户的接口

  • ValueState:即类型为T的单值状态。这个状态与对应的key绑定,是最简单的状态了。它可以通过update方法更新状态值,通过value()方法获取状态值。
  • ListState:即key上的状态值为一个列表。可以通过add方法往列表中附加值;也可以通过get()方法返回一个Iterable<T>来遍历状态值。
  • ReducingState:这种状态通过用户传入的reduceFunction,每次调用add方法添加值的时候,会调用reduceFunction,最后合并到一个单一的状态值。
  • FoldingState:跟ReducingState有点类似,不过它的状态值类型可以与add方法中传入的元素类型不同(这种状态将会在Flink未来版本中被删除)。
  • MapState:即状态值为一个map。用户通过putputAll方法添加元素

4.StateDescriptor

State 既然是暴露给用户的,那么就需要有一些属性需要指定:state 名称、val serializer、state type info。在对应的statebackend中,会去调用对应的create方法获取到stateDescriptor中的值。Flink通过StateDescriptor来定义一个状态。这是一个抽象类,内部定义了状态名称、类型、序列化器等基础信息。与上面的状态对应,从StateDescriptor派生了ValueStateDescriptor, ListStateDescriptor等descriptor

  • ValueState getState(ValueStateDescriptor)
  • ReducingState getReducingState(ReducingStateDescriptor)
  • ListState getListState(ListStateDescriptor)
  • FoldingState getFoldingState(FoldingStateDescriptor)
  • MapState getMapState(MapStateDescriptor)

最后来一张较为全面的图

Exit mobile version