學習 Flink(五):狀態
Flink 支援有狀態的操作和使用者方法。例如,視窗操作使用狀態維護不斷追加的聚合資料,sink 操作使用狀態保證一致性提供 exactly-once 語義。
Flink 狀態主要分為兩種:
- 操作狀態
- 鍵狀態
Flink 支援三種狀態後端:
- 記憶體
- 檔案系統
- RocksDB
操作狀態
操作狀態(Operator State),即每個操作狀態繫結到一個併發操作例項上。
Flink 提供了以下操作狀態:
- Broadcast State:
BroadcastState<K,V>
廣播狀態,儲存在廣播狀態中的元素可以被所有的操作訪問。
鍵狀態
Flink 提供了以下鍵狀態:
- Value State:
ValueState<T>
分割槽的單值狀態。 - Map State:
MapState<UK,UV>
分割槽的鍵值狀態。 - List State:
ListState<T>
分割槽的列表狀態。 - Reducing State:
ReducingState<T>
每次呼叫add(T)
新增新元素,會呼叫 ReduceFunction 進行聚合。傳入型別和返回型別相同。 - Aggregating State:
AggregatingState<IN,OUT>
每次呼叫add(T)
新增新元素,會呼叫 ReduceFunction 進行聚合。傳入型別和返回型別可以不同。
狀態後端
記憶體
適用場景:除錯、無狀態或可以容忍資料的丟失和重複。
檔案系統
適用場景:普通狀態、視窗、鍵值結構。
RocksDB
適用場景:超大狀態、超長視窗、大型鍵值結構。
可查詢的狀態
TODO
TTL
TODO
參考
- ofollow,noindex" target="_blank">Apache Flink Documentation: Working with State
- Apache Flink Documentation: The Broadcast State Pattern
- Apache Flink Documentation: Queryable State
- Flink原理與實現:詳解Flink中的狀態管理
- 流計算框架 Flink 與 Storm 的效能對比
- State TTL for Apache Flink: How to Limit the Lifetime of State