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)

最後來一張較為全面的圖