當咱們使用Flink進行流式計算時,一般會產生各類形式的中間結果,咱們稱之爲State。有狀態產生,就必然涉及到狀態的存儲,那麼Flink中定義了哪些形式的狀態存儲呢,下面一一給你們介紹一下。
顧名思義,MemoryStateBackend狀態後端是將狀態數據以Object的形式存放於Java Heap中。java
當執行檢查點時,MemoryStateBackend會爲當前的狀態生成snapshot,而後將快照信息做爲檢查點ack消息的一部分發送給JobManager(master節點),JobManager會將收到的快照數據存放於本身的堆內存中。node
MemoryStateBackend默認採用異步snapshots的方式來避免數據流管道阻塞,這是一種比較推薦的方式。固然,咱們也能夠經過配置來禁用這種方式。數據庫
new MemoryStateBackend(MAX_MEM_STATE_SIZE, false); // MAX_MEM_STATE_SIZE表示最大容許的狀態容量
MemoryStateBackend的使用限制後端
基於以上這些限制,咱們一般建議在以下場景中使用MemoryStateBackend:異步
此外,官方建議將託管內存(Managed Memory
)設置爲0,這樣能夠確保爲JVM上的用戶程序分配最大的內存。函數
FsStateBackend須要配置一個文件系統URL,如:「hdfs://namenode:40010/flink/checkpoints」 or 「file:///data/flink/checkpoints」。
FsStateBackend將做業執行過程當中的動態數據存放在TaskManager的內存當中,當執行檢查點時,狀態快照數據會被存儲在配置的文件系統目錄中,還有一部分metadata數據會被存儲在JobManager的內存當中。調試
一樣的,FsStateBackend也是默認採用異步snapshot的方式。咱們能夠經過實例化FsStateBackend來更改快照生成方式。code
new FsStateBackend(path, false);
官方建議在如下場景中使用FsStateBackend:內存
一樣官方建議將託管內存(Managed Memory
)設置爲0,這樣能夠確保爲JVM上的用戶程序分配最大的內存。開發
RocksDBStateBackend一樣須要配置一個文件系統URL:「hdfs://namenode:40010/flink/checkpoints」 or 「file:///data/flink/checkpoints」。
RocksDBStateBackend將做業執行過程當中的動態數據存放在RocksDB數據庫中,RocksDB數據庫默認存儲在TaskManager的數據目錄下。當執行檢查點時,整個RocksDB數據庫會被存檔到配置的文件系統目錄下。只有少許的metadata數據存儲在JobManager的內存當中。
一樣地,RocksDBStateBackend一般也採用異步snapshot的方式。
使用上的一些限制:
官方建議在如下場景中使用RocksDBStateBackend:
乍一看,好像跟FsStateBackend沒啥區別?其實不是,這裏須要注意的是,當咱們使用RocksDBStateBackend做爲狀態存儲時,能夠維護的狀態大小僅僅受限於程序可訪問的磁盤空間大小。這就使得咱們能夠維護比FsStateBackend更大的做業狀態。
固然,這也帶來一個問題:因爲與狀態後端之間的全部讀寫操做都要通過de-/serialization,所以這種方式犧牲了必定的吞吐量。