使用 DataStreaming 编写流式程序时通常结合 KeyedStream 实现状态的读取与更新,为了防止数据丢失并持续恢复,状态在检查点的持久化方式和位置取决于 StateBackend,下面基于 1.8.x 和 1.13.x 新老版本的状态后端进行分析以及工程环境下状态后端的使用与调优。
MemoryStateBackend 将内部状态存储在 Java TaskManager 的堆内存中,通过 CheckPoint 机制将状态进行 snapshot 快照保存至 JobManager 的堆内存中,其支持配置异步快照,只需初始化时增加 asynchronousSnapshots = true 参数即可:

其默认状态的大小限制为 5242880 即 5MB:

由于其状态大小的限制以及聚合状态必须存储在 JobManager 堆内存中的原因(上一篇内存分析已提到 JobManager 内存不大),MemoryStateBackend 的使用场景主要有:
- 本地调试
- 状态数据量较小的,流量不大的低吞吐的在线任务
由于新版本 HashMapS