StateBackend的意思是狀態後端。
狀態後端定義了流式應用程序狀態如何存儲和checkpoint的。不同的狀態後端以不同的方式來存儲其狀態,並且使用不同的數據結構來保存正在運行的應用程序的狀態。
MemoryStateBackend:
1 基於內存的狀態管理器,聚合類算子的狀態會存儲在JobManager的內存中
2 單次狀態大小默認最大被限制爲5MB,可以通過構造函數來指定狀態初始化內存大小。無論單次狀態大小最大被限制爲多少,都不可大於akka的frame大小(1.5MB,JobManager和TaskManager之間傳輸數據的最大消息容量)。狀態的總大小不能超過 JobManager 的內存。
3 是Flink默認的後端狀態管理器,默認是異步的
4 主機內存中的數據可能會丟失,任務可能無法恢復
5 將工作state保存在TaskManager的內存中,並將checkpoint數據存儲在JobManager的內存中
適用:
- 本地開發和調試
- 狀態比較少的作業
FsStateBackend:
1 基於文件系統的狀態管理器
2 如果使用,默認是異步
3 比較穩定,3個副本,比較安全。不會出現任務無法恢復等問題
4 狀態大小受磁盤容量限制
5 將工作state保存在TaskManager的內存中,並將checkpoint數據存儲在文件系統中
適用:
- 狀態比較大,窗口比較長,大的KV狀態
RocksDBStateBackend:
1 狀態數據先寫入RocksDB,然後異步的將狀態數據寫入文件系統。
2 正在進行計算的熱數據存儲在RocksDB,長時間才更新的數據寫入磁盤中(文件系統)存儲,體量比較小的元數據狀態寫入JobManager內存中(將工作state保存在RocksDB中,並且默認將checkpoint數據存在文件系統中)
3 支持的單 key 和單 value 的大小最大爲每個 2^31 字節(2GB)
4 RocksDBStateBackend是目前唯一支持incremental的checkpoints的策略
5 如果使用,默認是異步
適用:
- 非常大的狀態,長窗口,大的KV狀態
- 增量checkpoint
性能:MemoryStateBackend>RocksDBStateBackend>FsStateBackend
---------------
參考:
《Flink原理、實戰與性能優化》
https://www.jianshu.com/p/64e8588740e0