Flink Checkpoint 详解

本文详细解析Flink的Checkpoint机制,包括Checkpoint原理、数据对齐、异步快照以及状态后端的选择,阐述如何实现精确一次的语义,并提供了配置建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、checkpoint简介

Checkpoint是Flink实现容错机制最核心的功能,是Flink可靠性的基石,它能够根据配置周期性地基于Stream中各个Operator的状态来生成Snapshot快照,从而将这些状态数据定期持久化存储下来,当Flink程序一旦意外崩溃时,重新运行程序时可以有选择地从这些Snapshot进行恢复,从而修正因为故障带来的程序数据状态中断。

二、checkpoint原理

1. Checkpoint Barrier

Barrier是Flink分布式快照的核心概念之一,称之为屏障或者数据栅栏(可以理解为快照的分界线)。Barrier是一种特殊的内部消息,在进行Checkpoint的时候Flink会在数据流源头处周期性地注入Barrier,这些Barrier会作为数据流的一部分,一起流向下游节点并且不影响正常的数据流。Barrier的作用是将无界数据流从时间上切分成多个窗口,每个窗口对应一系列连续的快照中的一个,每个Barrier都带有一个快照ID,一个Barrier生成之后,在这之前的数据都进入此快照,在这之后的数据则进入下一个快照。

单并发:如图所示,当ID为n的Checkpoint Barrier到达每个算子后,表示要对n-1和n之间状态的更新做快照。
在这里插入图片描述

多并发:如图所示,每一个入流都会有barrier传过来,这里就会涉及到一个对齐的概念(详细介绍如下),如果没有对齐的话,当flink任务失败重启的话,则会重复消费barrier到达差之间的数据。
数据对齐:先到的入流后续的数据会先存到缓存里等待其他流的barrier到,等做完checkpoint并将barrier下发之后再正常的向下发送数据,步骤如下
第一步:算子子任务在某个输入通道中收到第一个ID为n的Checkpoint Barrier,但是其他输入通道中ID为n的Checkpoint Barrier还未到达,该算子子任务开始准备进行对齐。
第二步:算子子任务将第一个输入通道的数据缓存下来,同时继续处理其他输入通道的数据,这个过程被称为对齐。
第三步:第二个输入通道的Checkpoint Barrier抵达该算子子任务,该算子子任务执行快照,将状态写入State Backend,然后将ID为n的Checkpoint Barrier向下游所有输出通道广播。
第四步:对于这个算子子任务,快照执行结束,继续处理各个通道中新流入数据,包括刚才缓存起来的数据。
在这里插入图片描述

2. checkpoint整体步骤

首先,Flink的检查点协调器(Checkpoint Coordinator)触发一次Checkpoint(Trigger Checkpoint),这个请求会发送给Source的各个子任务。
各Source算子子任务接收到这个Checkpoint请求之后,会将自己的状态写入到状态后端,生成一次快照,并且会向下游广播Checkpoint Barrier。
Sourc

Flink中配置Checkpoint可以通过以下方式进行设置: ```java StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 每间隔2000ms进行CheckPoint env.enableCheckpointing(2000); // 设置CheckPoint模式为EXACTLY_ONCE env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE); // 设置CheckPoint超时时间为50000ms env.getCheckpointConfig().setCheckpointTimeout(50000); // 设置最大并发的CheckPoint数量为1 env.getCheckpointConfig().setMaxConcurrentCheckpoints(1); // 开启非对齐的CheckPoint env.getCheckpointConfig().enableUnalignedCheckpoints(); ``` 其中,`enableCheckpointing(n)`方法用于开启Checkpoint,参数`n`表示以毫秒为单位的checkpoint间隔。`setCheckpointingMode()`方法用于设置Checkpoint模式,`setCheckpointTimeout()`方法用于设置Checkpoint超时时间,`setMaxConcurrentCheckpoints()`方法用于设置最大并发的Checkpoint数量,`enableUnalignedCheckpoints()`方法用于开启非对齐的Checkpoint。\[1\] 此外,在`flink-conf.yaml`配置文件中也可以进行Checkpoint的相关配置,主要包括state backend的配置,例如`state.backend.async`、`state.backend.incremental`、`state.checkpoints.dir`、`state.savepoints.dir`等。\[3\] #### 引用[.reference_title] - *1* *2* [flinkcheckpoint配置](https://blog.csdn.net/weixin_43857576/article/details/122110132)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Flinkcheckpoint配置详解](https://blog.csdn.net/worldchinalee/article/details/107716744)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值