【偏理論】Flink1.11 狀態後端說明及部分原始碼閱讀
狀態後端型別
狀態後端是什麼?用於儲存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狀態後端支援增量檢查點操作,是其他兩種後端不支援的。
相關文章
- 論文閱讀 狀態壓縮
- HTTP 常見狀態碼說明HTTP
- 後端的狀態碼後端
- GVUserDefaults原始碼閱讀及使用原始碼
- 【原始碼閱讀】AndPermission原始碼閱讀原始碼
- redux 和 react-redux 部分原始碼閱讀ReduxReact原始碼
- React生態,dva原始碼閱讀React原始碼
- ORACLE 帳戶 狀態說明Oracle
- Appdash原始碼閱讀——部分opentracing支援APP原始碼
- 16、重做日誌檔案的狀態及重做日誌組的狀態說明
- PHP 有限狀態機使用說明PHP
- 【原始碼閱讀】Glide原始碼閱讀之with方法(一)原始碼IDE
- 【原始碼閱讀】Glide原始碼閱讀之into方法(三)原始碼IDE
- MySQL:AHI 部分程式碼流程說明MySql
- Galera Cluster for MySQL監控狀態說明MySql
- jQuery原始碼閱讀(十)---jQuery靜態方法分析jQuery原始碼
- ReactorKit原始碼閱讀React原始碼
- AQS原始碼閱讀AQS原始碼
- CountDownLatch原始碼閱讀CountDownLatch原始碼
- HashMap 原始碼閱讀HashMap原始碼
- delta原始碼閱讀原始碼
- 原始碼閱讀-HashMap原始碼HashMap
- NGINX原始碼閱讀Nginx原始碼
- Mux 原始碼閱讀UX原始碼
- HashMap原始碼閱讀HashMap原始碼
- fuzz原始碼閱讀原始碼
- RunLoop 原始碼閱讀OOP原始碼
- express 原始碼閱讀Express原始碼
- muduo原始碼閱讀原始碼
- stack原始碼閱讀原始碼
- Vue原始碼閱讀一:說說vue.nextTick實現Vue原始碼
- Elasticsearch 叢集和索引健康狀態及常見錯誤說明Elasticsearch索引
- 【原始碼閱讀】Glide原始碼閱讀之load方法(二)原始碼IDE
- PostgreSQL 原始碼解讀(3)- 如何閱讀原始碼SQL原始碼
- Vue2.x 響應式部分原始碼閱讀記錄Vue原始碼
- [Apache Doris] Apache Doris 後設資料設計及DDL操作原始碼閱讀Apache原始碼
- xxl-job原始碼閱讀二(服務端)原始碼服務端
- xxl-job原始碼閱讀一(客戶端)原始碼客戶端