【偏理論】Flink1.11 狀態後端說明及部分原始碼閱讀

iFence發表於2020-11-22

狀態後端型別

狀態後端是什麼?用於儲存flink應用狀態的結構。我們都知道Flink有很多有狀態的運算元,這些運算元的狀態需要有地方進行儲存,狀態後端就是用於儲存狀態的結構。flink執行過程中產生的檢查點也被儲存在狀態後端當中。(這句好像不對,狀態會以檢查點為單位進行儲存,檢查點會儲存在狀態後端當中)

Flink1.11中共支援3中型別的狀態後端:

  • MemoryStateBackend:適合本地測試和狀態本身很小的情況下使用
  • FsStateBackend:適合大狀態,長視窗和大的key/value狀態
  • RocksDBStateBackend:適合大狀態,長視窗和大的key/value狀態(與檔案系統狀態後端相同)

MemoryStateBackend

建立一個記憶體狀態後端可以用new MemoryStateBackend();預設最大狀態大小為5M,非同步快照。具體有下圖中的四個構造方法。

FsStateBackend

檔案系統狀態後端可以是本地檔案系統也可以是hdfs這樣的分散式檔案系統,建立檔案系統狀態後端同樣很簡單:

privat final String stateBackendUri = "hdfs://localhost:8020/flink/statebackend";
FsStateBackend fsStateBackend = new FsStateBackend(stateBackendUri);

該後端有N多種建構函式(如下圖),但是總共只有兩個構造引數1)檔案系統路徑,2)是否執行非同步快照(預設非同步快照)。非同步快照可以避免寫入狀態檢查點時影響flink程式的執行。

RocksDBStateBackend

RocksDBStateBackend本身是FLink內建的一種狀態後端,但是開發時需要引入額外的依賴。flink服務的lib資料夾下面有所以不需要將其打包進程式碼。是介於記憶體狀態後端和檔案系統狀態後端的一種狀態後端。他可以將狀態儲存在記憶體中,當觸發一次檢查點時才會將其checkpoint到檔案系統中。

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-statebackend-rocksdb_2.11</artifactId>
    <version>1.11.2</version>
    <scope>provided</scope>
</dependency>

他可以指定一個檔案系統路徑進行構建,也可以指定一個檔案系統狀態後端進行構建,如下圖。下圖中還有一個布林引數,表示是否啟用增量檢查點,預設不啟用。該狀態後端是唯一支援增量檢查點的狀態後端。

有關增量檢查點的利弊可以參考這篇文章

配置狀態後端

很簡單建立Flink執行環境然後在環境基礎上設定對應型別的狀態後端即可。

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStateBackend(new FsStateBackend("hdfs://namenode:40010/flink/checkpoints"));

三種狀態後端的利弊

記憶體狀態後端就不說了,適合開發,不太適合生產環境。

檔案系統狀態後端和RocksDB狀態後端第一節介紹的時候適合的場景相同,那使用的時候該如何選擇呢?

  • 受JNI限制,RocksDB狀態後端儲存的每個鍵或者值大小上下是2的31次方位元組,也就是20G。
  • 比起檔案系統狀態後端,RocksDB狀態後端可以存放更多的狀態在記憶體中,同時也意味著RocksDB狀態後端的吞吐量會比檔案系統小
  • RocksDB狀態後端所有的讀寫操作都需要經過序列化的反序列化,這種操作代價是很昂貴的
  • 但是RocksBD狀態後端支援增量檢查點操作,是其他兩種後端不支援的。

 

 

 

 

 

 

 

 

 

 

 

相關文章