大数据理论篇 No.5-聊聊Flink中的Checkpoint和Savepoint

第1章 Checkpoint

Flink作为分布式流计算处理引擎,而分布式处理引擎必须面对的问题就是故障,例如:进程被强制关闭、服务器宕机、网络连接中断等等。

Flink为了解决故障问题,保证在发生故障时能够完好的恢复,并且不丢失状态数据,定义了checkpoint机制。

在checkpoint机制中不得不提的一个东西就是:checkpoint barrier。他是一个特殊标记分隔符。barrier不通过数据源算子注入到数据流当中。为了标记所属的checkpoint范围,每个barrier会带有一个checkpoint编号,相当于在逻辑上把数据流切分成了多个块。在barrier之前的数据所产生的state会被包含在barrier所对应的checkpoint当中。barrier之后的数据则对用的是下个barrier和下一次checkpoint。并且Flink可以同时有多个checkpoint持续产生(比如checkpoint N、checkpoint N+1等等)。

我们透过下面这几张图,来看一下Flink checkpoint的数据流程:

Checkpoint是在所有任务处理完所有的等量的原始输入后,对全部任务状态进行的一个拷贝,它执行的过程大致如下:

  1. 暂停接收所有输入流。

  2. 等待处理完已经流入系统的数据,生成最新的状态。

  3. 将所有任务的状态拷贝到远程持久化存储,在所有任务完成拷贝后,生成全局一致性检查点。

  4. 恢复所有算子数据流的输入。

Checkpoint的作用,当然是为了保证故障之后可以恢复,那么我们来看一下checkpoint的恢复步骤,恢复的过程大致如下:

  1. 重启整个应用。

  2. 利用最新的checkpoint重置所有任务的状态。

  3. 恢复所有任务的处理。

数据源的恢复取决于消费的外部系统是否支持相关操作:重置消费;而对于sink端外部存储的恢复则需要分两阶段进行提交,详情可以查看笔者之前的文章:[大数据理论篇 No.3-看看Flink如何实现端到端的Exactly-once语义]。

这里再多一嘴:checkpoint的生成是根据用户设置,由Flink自动完成。

 

第2章 Savepoint

在任何一个系统中,都避免不了系统的迭代升级、BUG修复、环境升级等等操作,而在流计算当中,面对数据不断的涌入,Flink是如何实现这些操作,又避免影响系统的正常使用呢?这就是savepoint

Flink当中savepoint可以理解为checkpoint的特殊用途,原则上savepoint和checkpoint的生成算法完全一样,所以Savepoint可以看成包含一些额外元数据的特殊checkpoint。而Savepoint的生成时机和checkpoint有所不同,savepoint的生成不是由Flink自动完成,而实用户根据需要手动触发。

那么Savepoint在什么场景下使用呢:

  1. 作业Bug修复:Flink可以从savepoint启动一个与之前作业不同,但相互兼容的应用。这就意味着用户可以通过savepoint来将修复Bug后的程序更新到集群中。需要注意修复后的作业应用和sacepoint必须是兼容的,只有这样作业才能加载保存点内的state。

  2. 扩缩容:Flink通过savepoint启动新作业时,支持使用不同的并行度启动原作业,从而实现应用的扩缩容。

  3. Flink版本升级:当用户需要升级Flink版本时,也可以通过savepoint来进行迁移。

  4. 更换集群设备或数据中心。

  5. 归档/备份。

关于作业升级问题,要注意一点:升级后的算子节点可能发生变化,可能有新增和删除节点。这个时候savepoint如何能正确的将state分配给它对应的算子呢?其实,Flink首先会给每个算子分配一个唯一标识,如果应用在savepoint恢复之前发生过改动,恢复时会根据算子的唯一标识进行映射。但是Flink默认的唯一标识,会随着前置算子的增加或者删除而发生变化,所以官方建议用户手工指定算子的唯一标识,不要使用Flink默认分配的标识。从而使savepoint恢复时能够准确的将state恢复到原有算子上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
`flink.checkpoint.timeout` 和 `flink.checkpoint.interval` 是 Flink 与检查点相关的两个参数,它们之间存在一定的关系。 - `flink.checkpoint.timeout` 参数定义了执行检查点的超时时间,即当执行检查点操作时,如果超过了指定的超时时间仍未完成,则会被视为失败。 - `flink.checkpoint.interval` 参数定义了两次检查点之间的时间间隔,即多久执行一次检查点。 这两个参数的关系可以通过以下几点来说明: 1. `flink.checkpoint.timeout` 应该大于等于 `flink.checkpoint.interval`。确保超时时间足够长以容纳一个完整的检查点操作,否则可能会导致检查点失败。 2. 如果 `flink.checkpoint.timeout` 被设置得过小,可能会导致检查点操作在超时之前无法完成。在这种情况下,可以适当增加 `flink.checkpoint.timeout` 的值,以便给检查点操作足够的时间来完成。 3. 如果 `flink.checkpoint.interval` 被设置得过小,系统将更频繁地进行检查点操作,从而导致更高的系统开销和资源消耗。因此,在设置 `flink.checkpoint.interval` 时需要综合考虑系统的性能要求和资源限制。 需要根据应用程序的实际情况和需求来评估和调整 `flink.checkpoint.timeout` 和 `flink.checkpoint.interval` 的值。同时,还应该考虑 Flink 集群的配置和硬件资源是否能够支持所选的超时时间和间隔。在设置之后,建议进行性能测试和实际生产环境的实验来验证和优化这两个参数的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

pezynd

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

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

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

打赏作者

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

抵扣说明:

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

余额充值