有狀態的計算是流式計算框架的一個重要功能,很多複雜的計算場景都需要記錄一下相關的狀態。Flink State一種爲了滿足算子計算時需要歷史數據需求的,使用 checkpoint 機制進行容錯,存儲在 state backend 的數據結構。
1.State分類
Flink State被分爲keyedstate、operatorstate、BroadcastState三種;keyedstate主要應用在keystream上,它的特點是同一個子任務的同一個key共享同一個state;另一個operatorstate主要應用應用在source和sink,它的特點是同一個子任務共享同一個state。BroadcastState同一個算子的多個 sub task 共享一個 state。
2.state數據結構
state的數據結構包含ValueState 、MapState 、ListState三種結構。
ValueState 存儲單個值,訪問接口可能有兩種,get 和 set,在 State 上體現的是 update(T) / T value()。 MapState 的狀態數據類型是 Map,在 State 上有 put、remove等。 ListState 狀態數據類型是 List,訪問接口如 add、update 等。
存儲大的對象時要慎用ValueState 。
3.state存儲介質
state可以存儲到內存、文件、RocksDB。
基於內存的 MemoryStateBackend,狀態存儲在內存中,cp存儲到jobmanager的內存中。
基於 HDFS 或 OSS 的 FsStateBackend,狀態存儲在taskmanger的內存中,在做 cp(checkpoint)時存到文件系統,文件系統可以是HDFS。
基於 RocksDB 的 RocksDBStateBackend,將對象序列化成二進制存在內存和本地磁盤的 RocksDB 數據中,並在 cp 時存到文件系統,文件系統可以是HDFS。