Flink学习-实验4-snapshots

1. Flink学习-Streaming介绍
2. Flink学习-设置开发环境
3. Flink学习-实验1-对流数据进行过滤
4. Flink学习-实验1-对流数据进行转换
5. Flink学习-实验1-keyby分组
6. Flink学习-实验1-有状态的转换
7. Flink学习-实验1-相互连接的流
8. Flink学习-实验2-连接实现流join
9. Flink学习-实验3-时间和水印
10. Flink学习-实验3-窗口
11. Flink学习-实验3-ProcessFunction
12. Flink学习-实验3-Side Outputs
13. Flink学习-实验4-State Backends
flink-quickstart
flink-training-exercises

Checkpoints和Savepoints

概念定义:

  1. Snapshot-快照
    一个通用术语,指的是Flink工作状态的全局一致镜像。
    快照包括指向每个数据源的指针(例如,到文件或Kafka分区的偏移量),以及每个作业的有状态算子的状态副本,这些状态是由向上处理到数据源Source中一些位置的所有事件产生的。

  2. Checkpoint-检查点
    Flink自动进行快照,以便能够从故障中恢复。
    检查点可以是增量的,并且经过优化可以快速恢复。

  3. Externalized Checkpoint-外部或外置检查点。。。
    通常情况下,检查点不希望被用户来控制。
    Flink在作业运行时仅保留n个最新的检查点(n可配置),并在作业取消时删除它们。
    但我们可以将它们配置为保留,在这种情况下,我们可以手动从它们进行恢复。

  4. Savepoint-保存点
    由用户(或API调用)手动触发的快照,用于某些操作目的,例如有状态的重新部署/升级/重新缩放操作。
    保存点始终完整,并针对操作灵活性进行了优化。

状态快照是如何工作的

 Flink使用Chandy-Lamport算法的变体,称为异步屏障快照。
 Apache Flink项目的文档中详细描述了这种机制。

 简单地说,当检查点协调器(在作业管理器中)指示任务管理器开始检查点操作时,它会让所有源记录它们的偏移量,并将编了号的检查点屏障插入到它们的流中。
 这些屏障在作业图中流动,标记每个检查点之前和之后的流的一部分。

 当作业图中的每个算子接收其中一个屏障时,它将记录其状态。
 具有两个输入流(例如CoProcessFunction)的算子会执行屏障对齐,以便快照反映从两个输入流到(但不超过)两个屏障消费事件时所发生的状态。

 Flink的状态后端使用写时复制机制,允许流处理继续畅通无阻,同时对旧版本的状态进行异步快照。
 只有当快照持久存在时,这些旧版本的状态才会被垃圾收集。

恰好一次语义保证

当流处理应用程序出错时,可能会丢失或重复结果。使用Flink,根据我们为应用程序和运行它的集群所做的选择,以下任何一种结果都是可能的:

  1. Flink不会努力从故障中恢复(最多一次)
  2. 什么都不会丢失,但我们可能会遇到重复的结果(至少一次)
  3. 没有任何东西丢失或重复(恰好一次)

 鉴于Flink通过时空穿梭(倒带)和重放源数据流从故障中恢复,当我们将理想情况描述为”恰好一次”时,并不意味着每个事件都只处理了一次。
 相反,我们的意思是每个事件都只影响了Flink管理的状态一次。

要实现端到端的一次,以便源中的每个事件都只影响接收器一次,则必须满足以下条件【Source->Sink】:

  1. 数据来源必须是可重播的,比如可以持久化一段时间且可以多次消费的Kafka
  2. 接收器Sink必须是事务性的(或幂等的)

 如果我们不需要恰好一次语义,则可以通过禁用屏障对齐来获得一些性能。
 这是通过将Flink配置为使用CheckpointingMode.AT_LEAST_ONCE来完成的。

邵志鹏 wechat
扫一扫上面的二维码关注我的公众号
0%