Flink1.4 Checkpoints

本文介绍了Flink的Checkpoints机制,用于实现状态的容错性。检查点可以存储在JobManager内存或FileSystem中,推荐在生产环境中使用FileSystem以避免内存溢出。配置Checkpointing时,可以选择保留或删除取消时的检查点,并通过设置`ExternalizedCheckpointCleanup`进行管理。此外,文章还对比了Checkpoint与Savepoint的区别,并提供了配置和恢复检查点的详细步骤。

Flink1.3

概览

Checkpoints可以拿Flink中的状态具有容错性,它是通过允许恢复状态和流原有的位置,因此使应用程序具有无故障运行语义.

查看Checkpointing来为你的程序开启和配置checkpoints功能.

checkpoint存储

当开启checkpointing,管理状态被持久化来保证任务失败恢复到一致性. checkpoiting过程中持久化状态被保存在哪里是依赖选择什么Checkpoint存储.

可用的Checkpoint存储选项

Flink捆绑提供checkpoint存储类型

  • JobManagerCheckpointStorage
  • FileSystemCheckpointStorage

如果checkpoint目录被配置,使用的是FileSystemCheckpointStorage,否则使用的是JobManagerCheckpointStorage

JobManagerCheckpointStorage

JobManagerCheckpointStorage 存储checkpoint快照 在JobManager的堆中

如果内存超过指定大小 会发送内存溢出,会导致配置的checkpoint失败. 为设置这个特性,用户用相对应最大的大小实例化JobManagerCheckpointStorage .

new JobManagerCheckpointStorage(MAX_MEM_STATE_SIZE);

JobManagerCheckpointStorage的限制

  • 每个独立状态的大小默认设置为5MB. 在JobManagerCheckpointStorage构造函数里这个值可以增加.
  • 不顾配置状态大小,状态大小不能大于Akka frame的大小(查看配置)
  • 聚合状态占用大小一定要能在JobManager内存之内.

JobManagerCheckpointStorage 推荐使用

  • 本地开发或是调试
  • 任务使用占用空间非常小的状态,像一条记录一次的函数中(Map, FlatMap,Filter..). Kafka消费者需要非常小的状态.

FileSystemCheckpointStorage

FileSystemCheckpointStorage需要用系统URL(类型,地址,路径),像hdfs://namenode:40010/flink/checkpoints” 或 “file:///data/flink/checkpoints”.

配置checkpointing之后 ,会把状态快照写入配置好的系统文件或目录.最小的元数据需要被存储在Jobmanager的内存中(或是在高可用模式,在元数据checkpoint).

如果checkpoint目录被指定,FileSystemCheckpointStorage 就会被使用,来持久化checkpoint快照.

FileSystemCheckpointStorage 推荐在高可用中设置.

也推荐设置管理内存为0.这个确保大量内存内存分配到用户JVM上.

保存Checkpoint

checkpoints默认是不被保存,只是 使用失败的任务可以从中恢复.当程序被停用时被删除. 你也可以配置周期checkpoint保存起来. 这取决于配置保存checkpoints是否被删除当程序失败或是停用. 这种方式你有一个checkpoin可以恢复当你的任务失败时.

CheckpointConfig config = env.getCheckpointConfig();
config.enableExternalizedCheckpoints(ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);

 ExternalizedCheckpointCleanup 模式可以配置在你的任务被取消时怎么处理

  • ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION:保存checkpoint当任务取消.注意当任务失败你要手动清除这些状态.
  • ExternalizedCheckpointCleanup.DELETE_ON_CANCELLATION: 当任务失败时取消checkpoint.checkpoint状态仅仅可用是任务失败时.

目录结构

和stavepoints类似,checkpoint包含元数据文件和状态后端的依赖和一些额外数据文件.元数据文件和数据文件被存储在目录中,通过设置配置文件中state.checkpoints.dir, 也可设置在不同任务的代码里.

当前checkpoint目录结构(在FLINK-8531被介绍)如下

/user-defined-checkpoint-dir
    /{job-id}
        |
        + --shared/
        + --taskowned/
        + --chk-1/
        + --chk-2/
        + --chk-3/
        ... 

share目录是放状态的,里边可能有多个checkpoints, taskowned也是给状态用的,一定不能被Jobmanager删除, EXCLUSIVE 属于一个检验状态.

checkpoint目录不同 公共APIT,后期可能改变

通过配置文件来配置全局

state.checkpoints.dir: hdfs:///checkpoints/

为每个任务配置checkpoints

env.getCheckpointConfig().setCheckpointStorage("hdfs:///checkpoints-data/");

配置存储实例

另外,checkpoint存储可以被设置指定一个checkpoint存储实例,这样允许设置低级别配置,像写入缓存大小 .

env.getCheckpointConfig().setCheckpointStorage(
  new FileSystemCheckpointStorage("hdfs:///checkpoints-data/", FILE_SIZE_THESHOLD));

和Savepoint的不同

 checkpoint和savepoint有几点不同 

  • 使用后台 指定(低级别)数据格式,可能会增长.
  • 不支持Flink特性,像扩展

从保存的checkpoint数据恢复

任务恢复是从使用checkpoint就像从savepoint通过使用checkpoint元数据文件替代. (查看savepoint恢复). 注意如果元数据不能自包含,jobmanager需要访问数据文件它的指向:(查看目录结构)

$ bin/flink run -s :checkpointMetaDataPath [:runArgs]

在使用 Flink 的 `FsStateBackend` 时,如果你配置的状态后端路径指向 HDFS 上一个**不存在的目录**,比如: ```java env.setStateBackend(new FsStateBackend("hdfs://localhost:8020/flink/checkpoints")); ``` 那么 **Flink 会尝试自动创建该路径(包括所有父目录)吗?** --- ## ✅ 答案:**是的,Flink 会自动创建目录(如果权限允许)** > 只要 HDFS 可写、NameNode 正常运行,并且运行 Flink JobManager 的用户有写权限,Flink 在启动作业时会**自动创建状态后端指定的目录**。 --- ### 🔍 原理说明 当你设置 `FsStateBackend` 并提交 Flink 作业时: 1. JobManager 启动并初始化状态后端。 2. 它会通过 Hadoop 客户端尝试访问你指定的 HDFS 路径。 3. 如果路径不存在,Flink 会调用底层文件系统 API 尝试创建目录: ```java FileSystem.mkdirs(checkpointDirPath); ``` 4. 只要 HDFS 配置正确且用户有权限,目录就会被自动创建。 --- ### ✅ 示例代码验证 ```java StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 设置状态后端,路径 /flink/checkpoints 无需事先存在 env.setStateBackend(new FsStateBackend("hdfs://localhost:8020/flink/checkpoints")); // 开始你的流处理逻辑... env.addSource(...).map(...); env.execute("My Flink Job"); ``` ✅ 即使 `/flink/checkpoints` 不存在,Flink 也会自动创建它和子目录(如 `chk-123`, `savepoints` 等)。 --- ## 📁 实际生成的目录结构 Flink 自动创建以下内容: ``` hdfs://localhost:8020/flink/checkpoints/ ├── chk-123/ ← 检查点数据 ├── chk-124/ └── _metadata ← 最终一致性元信息文件 ``` 这些由 Checkpoint Coordinator 控制生成。 --- ## ⚠️ 注意事项与常见问题 | 问题 | 说明 | |------|------| | ❌ 权限不足 | 如果 Flink 使用的用户(如 `root` 或 `hadoop`)没有对 HDFS 写权限,则创建失败。建议统一用户或关闭权限检查(仅测试)。 | | ❌ HDFS 只读或处于安全模式 | 执行 `hdfs dfsadmin -safemode get` 查看是否在 Safe Mode。如果是,执行 `hdfs dfsadmin -safemode leave`。 | | ❌ 网络不通或 NameNode 未启动 | 报错:`Connection refused` 或 `UnknownHostException`。确保 HDFS 正常运行。 | | ✅ 支持嵌套路径 | 如 `"hdfs://localhost:8020/a/b/c/d"`,即使全路径都不存在,也会递归创建。 | --- ## 🛠 如何手动预创建目录(推荐生产环境) 虽然 Flink 能自动创建,但在生产环境中建议**提前创建并设置好权限**: ```bash # 创建目录 hdfs dfs -mkdir -p /flink/checkpoints # 设置权限(可选) hdfs dfs -chown -R flink:flink /flink hdfs dfs -chmod -R 755 /flink ``` 并在 `flink-conf.yaml` 中确保: ```yaml state.backend.fs.checkpointdir: hdfs://localhost:8020/flink/checkpoints ``` 这样更可控、避免因权限问题导致作业启动失败。 --- ## 🧩 补充:Savepoint 目录也会自动创建吗? ✅ 是的!当你执行: ```bash bin/flink savepoint <jobId> hdfs://localhost:8020/flink/savepoints ``` 只要路径合法且可写,Flink CLI 也会自动创建 `/flink/savepoints` 目录。 --- ## ✅ 总结 | 问题 | 回答 | |------|------| | `FsStateBackend` 路径不存在会报错吗? | ❌ 不会,Flink 会尝试自动创建 | | 是否需要手动创建 `/flink/checkpoints`? | ✅ 生产建议手动创建;测试环境可省略 | | 什么情况下自动创建会失败? | 权限不足、HDFS 不可用、网络问题、Safe Mode | | 路径必须以 `hdfs://` 开头吗? | ✅ 是的,否则会被当作本地文件系统路径 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值