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。用戶通過
put
或putAll
方法添加元素
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)
最後來一張較為全面的圖
