Flink的问题

flink消费Kafka的数据,怎么保证数据不丢失

上游可以调整偏移量, 下游事务写和幂等写, 中间靠checkpoint

Savepoint和Checkpoint分别是什么?

       Savepoint 是用来为整个流处理应用在某个“时间点”(point-in-time)进行快照生成的功能。该快照包含了数据源读取到的偏移量(offset),输入源的位置信息以及整个应用的状态。借助 分布式快照算法(Chandy-Lamport )的变体,我们可以在应用程序运行中得到某个“时间点”一致的快照。

       Savepoint由一个目录以及一个元数据文件构成。其中目录中通常为一个很大的二进制文件,文件中包含了整个流应用在Savepoint或Checkpoint的状态。另外元数据文件通常相对较小,其中包含了指向Savepoint目录中各个文件的指针。

上面关于Savepoint的介绍与Checkpoint很类似,但是二者还是有一些不同点的。

        首先Checkpoint 是 Flink 用来从故障中恢复的机制,它快照下了整个应用程序的状态,当然也包括输入源读取到的位点。当应用发生故障时,Flink 将通过从 Checkpoint 加载应用程序状态并从恢复出的历史读取位点继续应用的处理,就像什么事情都没发生一样。

SavePoint和Checkpoint的3个不同点

Savepoint 和 Checkpoint 作为 Apache Flink 中的两个非常独特的两个特性,它们在实现中看起来也很相似,然而二者之间也有不同的地方,主要包含如下3点:

目标上的差异

从概念上讲,Flink 的 Savepoint 和 Checkpoint 的不同之处很像传统数据库中备份与恢复日志之间的区别。Savepoint 的主要目标是充当手动备份、恢复暂停作业的方法。相反,Checkpoint 的主要目标是充当 Flink 中的恢复机制,确保能从潜在的故障中恢复。

实现上的差异

Checkpoint 和 Savepoint 在实现上也有不同。由于Savepoint设计时候更多的关注了应用的可移植性,支持对作业进行修改后状态能保持兼容,对应的,生成的恢复的成本更高;Checkpoint作为一种轻量与快速的机制,它可能利用底层状态后端的不同功能尽可能快速的恢复数据,如基于RocksDb状态后端的增量Checkpoint,可以极大加速Checkpoint过程,这种设计使得Checkpoint机制变得更加清量。

生命周期不同

Savepoint 是需要用户手动进行管理(调度、创建、删除)的。相反,Checkpoint 是自动和定期的,它们由 Flink 自动地周期性地创建和删除,无需用户的交互。

如何使用SavePoint

虽然流式应用处理的数据是持续地生成的,但是存在某些场景需要重新处理之前已经处理过的数据, 此时Savepoint 便派上了用场,它可以在以下几种情况中使用:

  • 部署流应用的一个新版本,如新功能、修复Bug或者一个更好的机器学习模型。
  • 引入 A/B 测试,使用相同的源数据测试程序的不同版本,从同一时间点开始测试而不牺牲先前的状态。
  • 在进行应用程序资源扩容或者缩减时使用。
  • 流应用程序到进行 Flink 版本切换或者集群迁移时。

结论

Checkpoint 和 Savepoint 是 Flink 中两个不同的功能,它们满足了不同场景下的需求以确保一致性、容错性、作业升级、BUG 修复、迁移、A/B测试等。这两个功能结合使用可以确保应用程序的状态在不同的场景和环境中保持不变。

原文: https://mp.weixin.qq.com/s/0VEaLg_iBR57OI35OSqwrA

猜你喜欢

转载自blog.csdn.net/someInNeed/article/details/119217409