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