Checkpoint机制和生产配置

1.前提

在将Checkpoint之前,先回顾一下flink处理数据的流程:

在这里插入图片描述

2. 概述

Checkpoint机制,又叫容错机制,可以保证流式任务中,不会因为异常时等原因,造成任务异常退出。可以保证任务正常运行。
(1)能在集群异常时,保持已计算的数据,下次恢复时能在已保存数据的基础上,继续计算(类似于快照);
(2)避免数据丢失(通过Barrier实现)

3.机制运行流程

在这里插入图片描述
解释:

(1)主节点上的检查点协调器(CheckpointCoordinator)会周期性地发送一个个地Barrier(栅栏,前面说的 偏移量做标识),Barrier会混在数据里,随着数据流,流向source算子;

(2)source算子在摄入数据的时候,如果碰到Barrier栅栏,不会去处理,Barrier就会让先算子去汇报当前的状态

(3)处理完之后,Barrier就会随着数据流,流向下一个算子;

(4)下一个算子收到Barrier,同样会停下手里的工作,也会向检查点协调器汇报当前的状态,把状态往主节点传递一份(备份,防止算子出错,状态丢失)
(5)上一步处理完之后,Barrier又会随着数据流向下一个算子,以此类推。
(6)等Barrier流经所有的算子之后,这一轮的快照就算制作完成

4. 状态后端

状态后端,StateBackend,就是Flink存储状态的介质(存储状态的地方)。Flink提供了三种状态后端的存储方式:

  • MemoryStateBackend(内存,使用HashMapStateBackend实现,生产一般不用)
  • FsStateBackend(文件系统,比如说HDFS,生产常用)
  • RocksDBStateBackend(RocksDB数据库,生产常用)
  • 同时也可以把状态外置到 Hbase和Redis,解决大状态存储问题
MemoryStateBackend

内存,掉电易失。不安全。基本不用。
在这里插入图片描述
配置如下:

state.backend: hashmap
# 可选,当不指定 checkpoint 路径时,默认自动使用 JobManagerCheckpointStorage
state.checkpoint-storage: jobmanager
FsStateBackend

FsStateBackend,文件系统的状态后端,就是把状态保存在文件系统中,常用来保存状态的文件系统有HDFS;
工作中常用;
在这里插入图片描述
配置如下:

state.backend: hashmap 
state.checkpoints.dir: file:///checkpoint-dir/ 

# 默认为FileSystemCheckpointStorage 
state.checkpoint-storage: filesystem
RocksDBStateBackend

RocksDBStateBackend,把状态保存在RocksDB数据库中。

RocksDB,是一个小型文件系统的数据库。

配置如下:

state.backend: rocksdb
state.checkpoints.dir: file:///checkpoint-dir/

# Optional, Flink will automatically default to FileSystemCheckpointStorage
# when a checkpoint directory is specified.
state.checkpoint-storage: filesystem

特点:可以保持巨大的状态,且支持增量状态保存。

5.重启策略

5.1 重启策略概述

Flink流式任务,需要长期运行,就算遇到一些数据异常问题等,也不能随便退出。

Flink为了让任务能够在遇到异常退出时,能够重新启动,正常运行,Flink提出了重启策略的概念。

5.2 Flink的重启策略

Flink支持四种类型的重启策略:

  • none:没有重启。任务一旦遇到异常,就退出。

  • fixed-delay:固定延迟重启策略。也就是说,可以配置一个重启的次数。超过次数后,才会退出。

  • failure-rate:失败率重启策略。也就是说,任务的失败频率。超过该频率后才退出。在设定的频率之内,不会退出。

  • exponential-delay:指数延迟重启策略。也就是说,任务在失败后,下一次的延迟时间是随着指数增长的。

5.3案例演示
模拟异常的代码
import org.apache.flink.api.common.RuntimeExecutionMode;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.MapFunction;
import org
<think>好的,我现在需要帮助用户解决Flink CDC 3.0.0中checkpointsavepoint未按预期保存到硬盘的问题。首先,我需要回顾之前的对话,确保我理解用户的需求之前的配置。用户之前询问如何配置Flink CDC 3.0.0将MySQL同步到Doris,并设置checkpointsavepoint存储到硬盘。现在用户遇到的问题是配置后这些点未正确保存,需要找出原因并提供解决方案。 首先,我应该检查用户提供的YAML配置示例,看是否存在明显的配置错误。例如,检查state.backend是否正确设置为filesystem,checkpoints.dirsavepoints.dir的路径是否有效,权限是否正确。另外,Flink的版本兼容性也是一个可能的问题,用户使用的是Flink CDC 3.0.0,需要确认该版本是否支持相关配置。 接下来,常见的导致checkpointsavepoint保存失败的原因可能包括:路径权限问题、配置错误、集群配置问题、资源不足或版本兼容性问题。我需要逐一排查这些可能性。例如,文件路径是否正确,是否有写入权限,是否使用了正确的URI格式(如file://)。此外,用户可能在使用本地文件系统,但在生产环境中可能需要分布式存储,如HDFS或S3,但用户的问题可能出现在本地测试环境中。 还需要考虑Flink作业的日志,是否有相关的错误信息提示,比如无法创建目录或写入文件失败。用户可能需要检查作业管理器的日志,或者通过Flink的Web UI查看checkpoint的状态。此外,savepoint需要手动触发,用户是否正确地执行了savepoint命令,并指定了正确的路径。 另外,用户可能没有正确配置state.backend,或者没有启用checkpointing。在配置文件中,execution.checkpointing.interval必须设置,并且state.backend需要指定为filesystem。同时,savepoints.enabled需要设为true。用户提供的示例配置中这些设置看起来正确,但可能存在笔误或实际部署时的差异。 还有可能是Doris的配置问题,但根据问题描述,checkpointsavepoint是Flink的内部机制,与Doris的配置关系不大,除非Doris的写入影响了Flink的状态管理。不过主要问题应该集中在Flink配置上。 可能的解决方案包括:验证路径权限,检查配置项是否正确,确认Flink集群的配置,查看日志以获取具体错误,升级Flink或CDC版本以修复可能的bug,以及测试配置是否有效。此外,用户可能需要使用绝对路径而不是相对路径,并确保所有节点都能访问存储路径,特别是在分布式环境中。 最后,我需要将这些思考整理成结构化的回答,分点列出可能的原因对应的解决方案,并给出验证方法,帮助用户逐步排查问题。同时,根据用户之前的引用,可能还需要补充如何验证Doris的启动数据库创建,确保整个流程的完整性。</think>### Flink CDC 3.0.0 Checkpoint/Savepoint未保存至硬盘的原因及解决方案 --- #### **一、常见原因分析** 1. **路径权限问题** - 检查`file:///opt/flink/checkpoints``file:///opt/flink/savepoints`路径是否存在且Flink进程有读写权限 - **验证方法**: ```bash ls -ld /opt/flink/checkpoints # 检查目录权限 touch /opt/flink/checkpoints/test.txt # 测试写入权限 ``` 2. **配置项缺失或错误** - `state.backend`未正确设置为`filesystem`[^1] - `checkpoints.dir`/`savepoints.dir`未使用完整URI格式(如`file://`前缀缺失) - **错误示例**: ```yaml state: backend: rocksdb # 错误的后端类型 checkpoints: dir: /opt/flink/checkpoints # 缺少file://前缀 ``` 3. **集群运行模式限制** - 本地模式(LocalEnvironment)可能限制分布式存储配置 - **解决方案**:提交作业时显式指定集群模式: ```bash flink run -t yarn-per-job -c ... # YARN模式 ``` 4. **Flink版本兼容性问题** - Flink CDC 3.0.0需匹配Flink 1.13+版本[^2] - **验证方法**: ```bash flink --version # 检查Flink版本 ``` --- #### **二、配置修正与验证** ##### **修正后的YAML配置** ```yaml execution: checkpointing: interval: 60s mode: exactly_once timeout: 5min # 必须显式启用checkpoint enabled: true state: backend: filesystem # 必须为filesystem checkpoints: dir: file:///opt/flink/checkpoints # 完整URI格式 savepoints: dir: file:///opt/flink/savepoints # 其他配置保持不变... ``` ##### **验证步骤** 1. **检查Checkpoint状态**: ```bash curl http://<jobmanager>:8081/jobs/<jobId>/checkpoints ``` 输出应包含`"completed"`状态检查点: ```json { "counts": {"completed": 3}, "latest": {"completed": {"id": 12345}} } ``` 2. **手动触发Savepoint**: ```bash flink savepoint <jobId> file:///opt/flink/savepoints -yid <yarnAppId> ``` 成功后会返回类似提示: ``` Savepoint completed. Path: file:///opt/flink/savepoints/savepoint-1337-abcd ``` 3. **物理文件验证**: ```bash tree /opt/flink/checkpoints # 应看到_chk目录metadata文件 ``` --- #### **三、进阶排查方法** 1. **查看TaskManager日志** - 搜索关键字`CheckpointStorage`,观察是否初始化成功: ``` Initializing checkpoint storage: FileSystemCheckpointStorage ``` 2. **检查Hadoop依赖(若使用HDFS)** - 需在`flink/lib`目录添加`hadoop-common`的JAR包 3. **网络存储问题(NFS/云存储)** - 测试网络存储连通性: ```bash hdfs dfs -ls hdfs:///flink/checkpoints # HDFS示例 ``` --- #### **四、典型错误案例** **案例现象**: Checkpoint目录生成但无实际数据 **根本原因**: Doris写入失败导致状态回滚 **解决方案**: 1. 检查Doris FE/BE日志: ```bash tail -f doris/log/fe.log | grep "Rejected" ``` 2. 调整Doris的`query_timeout``stream_load_default_timeout_second`参数 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别这么骄傲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值