检查点配置
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 每隔 1 秒启动一次检查点保存 env.enableCheckpointing(1000);
检查点的间隔时间是对处理性能和故障恢复速度的一个权衡。如果我们希望对性能的影响更小,可以调大间隔时间;而如果希望故障重启后迅速赶上实时的数据处理,就需要将间隔时间设小一些。
检查点存储(Checkpoint Storage)
检查点具体的持久化存储位置,取决于"检查点存储"(CheckpointStorage)的设置。默认情况下,检查点存储在 JobManager 的堆(heap)内存中。而对于大状态的持久化保存,Flink 也提供了在其他存储位置进行保存的接口,这就是CheckpointStorage。通过调用检查点配置的.setCheckpointStorage() 来配置, 需要传入一个CheckpointStorage 的实现类。Flink 主要提供了两种
CheckpointStorage:作业管理器的堆内存(JobManagerCheckpointStorage)和文件系统(FileSystemCheckpointStorage)。 // 配置存储检查点到 JobManager 堆内存 env.getCheckpointConfig().setCheckpointStorage(new JobManagerCheckpointStorage()); // 配置存储检查点到文件系统 env.getCheckpointConfig().setCheckpointStorage(new FileSystemCheckpointStorage("hdfs://namenode:40010/flink/checkpoints"));
检查点还有很多可以配置的选项,可以通过获取检查点配置(CheckpointConfig)来进行设置。
CheckpointConfig checkpointConfig = env.getCheckpointConfig();
- 检查点模式(CheckpointingMode)
设置检查点一致性的保证级别,有"精确一次"(exactly-once)和"至少一次"(at-least-once)两个选项。默认级别为exactly-once,而对于大多数低延迟的流处理程序,at-least-once 就够用了,而且处理效率会更高。
- 超时时间(checkpointTimeout)
用于指定检查点保存的超时时间,超时没完成就会被丢弃掉。传入一个长整型毫秒数作为参数,表示超时时间。
- 最小间隔时间(minPauseBetweenCheckpoints)
用于指定在上一个检查点完成之后,检查点协调器(checkpoint coordinator)最快等多久可以出发保存下一个检查点的指令。这就意味着即使已经达到了周期触发的时间点,只要距离上一个检查点完成的间隔不够,就依然不能开启下一次检查点的保存。这就为正常处理数据留下了充足的间隙。当指定这个参数时,maxConcurrentCheckpoints 的值强制为 1。
- 最大并发检查点数量(maxConcurrentCheckpoints)
用于指定运行中的检查点最多可以有多少个。由于每个任务的处理进度不同,完全可能出现后面的任务还没完成前一个检查点的保存、前面任务已经开始保存下一个检查点了。这个参数就是限制同时进行的最大数量。
5.不对齐检查点(enableUnalignedCheckpoints)
不再执行检查点的分界线对齐操作,启用之后可以大大减少产生背压时的检查点保存时间。这个设置要求检查点模式(CheckpointingMode)必须为 exctly-once,并且并发的检查点个数为 1。
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 启用检查点,间隔时间 1 秒 env.enableCheckpointing(1000); CheckpointConfig checkpointConfig = env.getCheckpointConfig(); // 设置精确一次模式 checkpointConfig.setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE); // 最小间隔时间 500 毫秒 checkpointConfig.setMinPauseBetweenCheckpoints(500); // 超时时间 1 分钟 checkpointConfig.setCheckpointTimeout(60000); // 同时只能有一个检查点 checkpointConfig.setMaxConcurrentCheckpoints(1); // 开启检查点的外部持久化保存,作业取消后依然保留 checkpointConfig.enableExternalizedCheckpoints( ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION); // 启用不对齐的检查点保存方式 checkpointConfig.enableUnalignedCheckpoints(); // 设置检查点存储,可以直接传入一个 String,指定文件系统的路径 checkpointConfig.setCheckpointStorage("hdfs://my/checkpoint/dir")
保存点(Savepoint)
保存点就是通过检查点的机制来创建流式作业状态的一致性镜像(consistent image)的。保存点中的状态快照,是以算子 ID 和状态名称组织起来的,相当于一个键值对。从保存点启动应用程序时,Flink 会将保存点的状态数据重新分配给相应的算子任务。
检查点是由 Flink 自动管理的,定期创建, 发生故障之后自动读取进行恢复,这是一个"自动存盘"的功能;而保存点不会自动创建,必须由用户明确地手动触发保存操作,所以就是"手动存盘"。因此两者尽管原理一致,但用途就有所差别了:检查点主要用来做故障恢复,是容错机制的核心;保存点则更加灵活,可以用来做有计划的手动备份和恢复。
保存点中状态都是以算子 ID-状态名称这样的 key-value 组织起来的,算子ID 可以在代码中直接调用SingleOutputStreamOperator 的.uid()方法来进行指定:
DataStream<String> stream = env .addSource(new StatefulSource()) .uid("source-id") .map(new StatefulMapper()) .uid("mapper-id") .print();
对于没有设置 ID 的算子,Flink 默认会自动进行设置,所以在重新启动应用后可能会导致ID 不同而无法兼容以前的状态。所以为了方便后续的维护,强烈建议在程序中为每一个算子手动指定 ID。
浙公网安备 33010602011771号