配置了 RocksDB,Flink 中所有狀態數據都會存在 RocksDB 嗎?
1.大家首先要知道的一些背景
在說背景前,先說一下標題的結論:你配置的 rocksdb 只會影響 flink 任務中 keyed state 存儲的方式和地方,flink 任務中的 operator state 不會受到影響。
狀態:狀態就是用戶在程序中使用的數據結構。比如 flink 中的 MapState,ValueState,ListState。在一個 flink 任務中,不管我們使用了多少狀態,這些狀態只會分為 operator state,keyed state 兩類狀態。
狀態管理:為了防止 long run 的 flink 任務掛了導致狀態丟失,產生數據質量問題,flink 提供了狀態管理(Checkpoint,Savepoint)的能力把我們使用的狀態給管理起來,定時的保存到遠程。然后可以在 flink 任務 failover 時,從遠程把狀態數據恢復到 flink 任務中,保障數據質量。
狀態后端:狀態后端就是決定了以什么樣數據結構,什么樣的存儲方式去存儲和管理我們的狀態。flink 目前官方提供了 memory、filesystem,rocksdb 三種狀態后端來存儲我們的狀態。
2.在配置不同的狀態后端時,到底對 flink 任務有什么影響
其實所有的內容都濃縮到了這樣圖中:
sql 開發
橫向(行)來看,分為 Operator state-backend、Keyed state-backend 來管理一個 flink 任務中的所有狀態(operator state,keyed state)
縱向(列)來看,用戶可以通過配置 memory,filesystem,rocksdb,在 flink 任務中生成 MemoryStateBackend,FsStateBackend,RocksdbStateBackend,其聲明了整個任務的狀態管理后端類型
每個格子中的內容就是用戶在配置 xx 狀態后端(列)時,給用戶使用的狀態(行)生成的狀態后端實例,生成的這個實例就是用于管理用戶使用的狀態的。
那么可以得到的結論就是:
- flink 任務中的 operator state。無論用戶配置哪種狀態后端(無論是 memory,filesystem,rocksdb),都是使用 DefaultOperatorStateBackend 來管理的,狀態數據都存儲在內存中。
- flink 任務中的 keyed state,會有不同。用戶在配置 rocksdb 時,會使用 RocksdbKeyedStateBackend 去管理狀態;用戶在配置 memory,filesystem 時,會使用 HeapKeyedStateBackend 去管理狀態。
- 那么也就是說,你配置的 rocksdb 只會影響 keyed state 存儲的方式和地方,operator state 不會受到影響。