增量检查点和全量检查点
目前Flink有3种状态后端,即(内存MemoryStateBackend)文件系统(FsStateBackend)和RocksDB(RocksDBStateBackend),只有RocksDB状态后端支持增量检查点,内存只能全量。该功能默认关闭,要打开它可以在flink-conf.yaml中配置,或者在代码中添加:
全量检查点含义
- 顾名思义就是每次记录都是所有的checkpoint信息;
- 全量检查点也是生成中常用的方式,默认checkpoint是不开启的,我们通常需要在代码中加入:
// 开启一个每5分钟一次的检查点,并设置精准一次模式
env.enableCheckpointing(5 * 60 * 1000, CheckpointingMode.EXACTLY_ONCE);
- 生成环境中通常保存到HDFS中:
// 配置存储检查点到文件系统
env.getCheckpointConfig().setCheckpointStorage(new FileSystemCheckpointStorage("hdfs://namenode:40010/flink/checkpoints"));
增量检查点的含义
增量检查点只包含本次checkpoint与上次checkpoint状态之间的差异,而不是所有状态
- 为什么增量检查点只支持RocksDB?
由RocksDB本身的特性决定的。RocksDB是一个基于日志结构合并(LSM树)的键值式存储引擎, - 增量检查点的弊端
2.1、 增量检查点解决了大状态checkpointing的问题,但是在从检查点恢复现场时会带来潜在的overhead。当程序出问题后,TaskManager需要从多个检查点中加载状态数据,并且这些数据中还可能会包含将被删除的状态。就算磁盘空间紧张,旧检查点的文件也不能随便删除,因为新检查点仍然会引用它们,如果贸然删除,程序就无法恢复现场了。
2.2 、如果状态本身的数据量不大,并且状态之间的overlap也不明显的话,开启增量检查点可能会造成反效果(checkpoint数据量异常膨胀),所以应该按需使用。