State Backend
说明:
- 默认情况下,State 会保存在 TaskManager 的内存中,CheckPoint 会存储在 JobManager 的内存中。(也就是说默认情况下StateBackend使用的是MemoryStateBackend)
- State 和 CheckPoint 的存储位置取决于 StateBackend 的配置。
- Flink 一共提供 了 3 种 StateBackend 。
- 基于内存的MemoryStateBackend
- 基于文件系统的FsStateBackend
- 基于RockDB作为存储介质的RocksDBState-Backend
1、MemoryStateBackend
说明:
- 基于内存的状态管理,具有非常快速和高效的特点,但也具有非常多的限制,最主要的就 是内存的容量限制,一旦存储的状态数据过多就会导致系统内存溢出等问题,从而影响整个 应用的正常运行。
- 同时如果机器出现问题,整个主机内存中的状态数据都会丢失,进而无法 恢复任务中的状态数据。因此从数据安全的角度建议用户尽可能地避免在生产环境中使用 MemoryStateBackend。
流程:
![](https://img.haomeiwen.com/i6095988/62637f6f12c33a9a.png)
配置:
streamEnv.setStateBackend(new MemoryStateBackend(10*1024*1024))
应用场景:
- 在本地开发或调试中,优先使用MemorySatatebacked.
- MemoryStateBackend最适合具有小状态大小的用例和有状态流处理应用程序.
2、FsStateBackend
说明:
- FsStateBackend 是基于文件系统的一种状态管理器,这里的文件系统可以是本地文件系统,也可以是 HDFS 分布式文件系统(或其他文件存储服务).
- FsStateBackend 更 适合任务状态非常大的情况,例如应用中含有时间范围非常长的窗口计算,或 Key/value State 状态数据量非常大的场景。
流程:
![](https://img.haomeiwen.com/i6095988/5948abcc38479627.png)
配置:
streamEnv.setStateBackend(new FsStateBackend("hdfs://hadoop101:9000/checkpoint/cp1"))
应用场景:
- FsStateBackend最适合处理大状态,长窗口或大键/值状态的Flink有状态流处理作业。
- FsStateBackend最适合每个高可用性设置。
3、RocksDBStateBackend
说明:
- RocksDBStateBackend 是 Flink 中内置的第三方状态管理器,和前面的状态管理器不同, RocksDBStateBackend 需要单独引入相关的依赖包到工程中
- RocksDBStateBackend 采用异步的方式进行状态数据的 Snapshot,任务中的状态数据首 先被写入本地 RockDB 中,这样在 RockDB 仅会存储正在进行计算的热数据,而需要进行 CheckPoint 的时候,会把本地的数据直接复制到远端的 FileSystem 中。
流程:
![](https://img.haomeiwen.com/i6095988/bae2ddcd76045f91.png)
配置:
streamEnv.setStateBackend( new RocksDBStateBackend ("hdfs://hadoop101:9000/checkpoint/cp2"))
应用场景:
- RocksDBStateBackend最适合处理大状态,长窗口或大键/值状态的Flink有状态流处理作业。
- RocksDBStateBackend最适合每个高可用性设置。
- RocksDBStateBackend是目前唯一可用于支持有状态流处理应用程序的增量检查点的状态后端。
网友评论