一文了解Flink State Backends

當咱們使用Flink進行流式計算時,一般會產生各類形式的中間結果,咱們稱之爲State。有狀態產生,就必然涉及到狀態的存儲,那麼Flink中定義了哪些形式的狀態存儲呢,下面一一給你們介紹一下。

State Backends

  • MemoryStateBackend
  • FsStateBackend
  • RocksDBStateBackend

MemoryStateBackend

顧名思義,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的使用限制後端

  • 每一個狀態的大小默認限制爲5MB,能夠經過構造函數設置狀態大小
  • 無論如何配置最大狀態大小,都不能超過akka幀大小
  • 聚合狀態大小必須合乎JobManager的內存大小

基於以上這些限制,咱們一般建議在以下場景中使用MemoryStateBackend:異步

  • 本地開發調試
  • 無狀態做業或者保存少許狀態的做業

此外,官方建議將託管內存(Managed Memory)設置爲0,這樣能夠確保爲JVM上的用戶程序分配最大的內存。函數

FsStateBackend

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

RocksDBStateBackend一樣須要配置一個文件系統URL:「hdfs://namenode:40010/flink/checkpoints」 or 「file:///data/flink/checkpoints」。

RocksDBStateBackend將做業執行過程當中的動態數據存放在RocksDB數據庫中,RocksDB數據庫默認存儲在TaskManager的數據目錄下。當執行檢查點時,整個RocksDB數據庫會被存檔到配置的文件系統目錄下。只有少許的metadata數據存儲在JobManager的內存當中。

一樣地,RocksDBStateBackend一般也採用異步snapshot的方式。

使用上的一些限制:

  • 因爲RocksDB的JNI bridge API是基於byte[]的,所以可支持的最大key值大小是2^31 byte。這個限制通常狀況下不會有問題,但看成業中的狀態是基於不斷地merge操做生成時,很容易超過這個大小限制,這個時候就會出現檢索失敗的錯誤。

官方建議在如下場景中使用RocksDBStateBackend:

  • 做業中包含大狀態、長窗口以及大鍵值狀態
  • 高可用應用場景

乍一看,好像跟FsStateBackend沒啥區別?其實不是,這裏須要注意的是,當咱們使用RocksDBStateBackend做爲狀態存儲時,能夠維護的狀態大小僅僅受限於程序可訪問的磁盤空間大小。這就使得咱們能夠維護比FsStateBackend更大的做業狀態。

固然,這也帶來一個問題:因爲與狀態後端之間的全部讀寫操做都要通過de-/serialization,所以這種方式犧牲了必定的吞吐量。

總結

  • MemoryStateBackend、FsStateBackend都是基於堆的狀態存儲
  • RocksDBStateBackend是目前惟一的一種支持增量checkpoint的狀態後端
相關文章
相關標籤/搜索