目录
简述
从概念上讲, Flink 的 Savepoint 与 Checkpoint 的不同之处类似于传统数据库中的备份与恢复日志之间的差异。 Checkpoint 的主要目的是为意外失败的作业提供恢复机制。 Checkpoint 的生命周期由 Flink 管理,即 Flink 创建,管理和删除 Checkpoint - 无需用户交互。 作为一种恢复和定期触发的方法,Checkpoint 实现有两个设计目标:i)轻量级创建和 ii)尽可能快地恢复。 可能会利用某些特定的属性来达到这个,例如, 工作代码在执行尝试之间不会改变。 在用户终止作业后,通常会删除 Checkpoint(除非明确配置为保留的 Checkpoint)。
与此相反、Savepoint 由用户创建,拥有和删除。 他们的用例是计划的,手动备份和恢复。 例如,升级 Flink 版本,调整用户逻辑,改变并行度,以及进行红蓝部署等。 当然,Savepoint 必须在作业停止后继续存在。 从概念上讲,Savepoint 的生成,恢复成本可能更高一些,Savepoint 更多地关注可移植性和对前面提到的作业更改的支持。
除去这些概念上的差异,Checkpoint 和 Savepoint 的当前实现基本上使用相同的代码并生成相同的格式。然而,目前有一个例外,我们可能会在未来引入更多的差异。例外情况是使用 RocksDB 状态后端的增量 Checkpoint。他们使用了一些 RocksDB 内部格式,而不是 Flink 的本机 Savepoint 格式。这使他们成为了与 Savepoint 相比,更轻量级的 Checkpoint 机制的第一个实例。
官方文档:https://ci.apache.org/projects/flink/flink-docs-release-1.12/zh/ops/state/savepoints.html
checkpoint的使用
环境: flink job 采用的是on yarn模式
步骤1: 修改 flink-conf.yaml
state.backend 存储和检查点的后台存储。可选值为rocksdb filesystem hdfs
state.checkpoints.dir 保存检查点目录
state.backend.incremental 增量存储
state.checkpoints.num-retained 保留最近检查点的数量
注释: hdfs://haservice/flink-checkpoints 是dfs.nameservices, 我的hdfs是HA模式, 所有不需要添加端口
步骤2: 修改代码
env.enableCheckpointing(5000)
env.getCheckpointConfig.setCheckpointTimeout(60000)
在使用的过程中遇到的问题
问题1:
Caused by: org.apache.flink.runtime.rest.util.RestClientException: [Internal server error., <Exception on server side:
akka.pattern.AskTimeoutException: Ask timed out on [Actor[akka://flink/user/dispatcher#-401211917]] after [10000 ms]. Message of type [org.apache.flink.runtime.rpc.messages.LocalFencedMessage]. A typical reason for `AskTimeoutException` is that the recipient actor didn't send a reply.
解决方案: 在flink-conf.yaml添加如下内容
akka.ask.timeout: 60s
web.timeout: 120000
问题2:
org.apache.kafka.common.KafkaException: Unexpected error in InitProducerIdResponse; The transaction timeout is larger than the maximum value allowed by the broker (as configured by transaction.max.timeout.ms).
解决方案:
参考: https://www.cnblogs.com/lillcol/p/12092869.html
flink代码 的sink 添加如下:
问题3:
采用RichSourceFunction从Hbase获取维表数据, 但是只获取一次, 成功获取后变成了 FINISHED 状态, checkpoint 就不能继续执行, 一直停留
解决方案:
在KeyedBroadcastProcessFunction的open方法中获取hbase的配置信息
如下:
svaepoint 的使用
1 全局一致性快照
Flink通过Savepoint功能可以做到程序升级后,继续从升级前的那个点开始执行计算,保证数据不中断
全局,一致性快照。可以保存数据源offset,operator操作状态等信息
可以从应用在过去任意做了savepoint的时刻开始继续消费
1: 配置flink-conf.yaml
state.savepoints.dir: hdfs://haservice/flink-savepoints
2: 触发 Savepoint
我是在on yarn环境,操作如下:
执行命令: bin/flink savepoint 9d0d12c645c39d940cbdeb4713d57f39 -yid application_1611710499717_2476
结果如下:
3:从 Savepoint 恢复
执行命令:
bin/flink run -c com.application.TestApplication -m yarn-cluster -s hdfs://haservice/flink-savepoints/savepoint-d947a1-99573a0dd087 -ynm TestApplication -ys 2 Test.jar
结果如下:
完成