简述Flink的Checkpoint底层如何实现的?savepoint和checkpoint有什么区别 ?
Flink的Checkpoint底层实现主要基于“Chandy-Lamport algorithm”算法,并通过JobManager管理节点中的CheckpointCoordinator组件来控制其启动过程。该组件会周期性地向数据源节点发送执行Checkpoint的请求,执行频率取决于用户配置的CheckpointInterval参数。
在执行过程中,CheckpointCoordinator组件向每个数据源节点发送Checkpoint执行请求,此时数据源节点中的算子会将消费数据对应的Position发送到JobManager管理节点中。JobManager节点会存储Checkpoint元数据,用于记录每次执行Checkpoint操作过程中算子的元数据信息,例如,在FlinkKafkaConsumer中会记录消费Kafka主题的偏移量,用于确认从Kafka主题中读取数据的位置。
Checkpoint的主要目标是实现容错性,保证在发生故障时可以快速恢复到最近一次检查点的状态。它在运行时自动进行,不需要用户互动,保证了应用程序的数据不会丢失。
而Savepoint与Checkpoint在Flink中虽然都用于保存应用程序的状态信息,但它们在功能和用途上存在一些区别。Savepoint是Flink中的一个功能,允许用户在应用程序运行过程中手动触发保存状态信息,并将其存储在持久化存储中。Savepoint的设计更注重可移植性和操作的灵活性,特别是在作业的变化方面,但其制作和恢复的成本会比Checkpoint稍高。
总结来说,Checkpoint和Savepoint都是Flink中用于保存应用程序状态的重要机制,但它们在实现方式、触发方式、使用场景以及成本等方面存在差异。Checkpoint主要用于实现自动容错,而Savepoint则提供了更灵活的手动保存和恢复状态的功能。