flink通过状态快照实现容错

状态后端#

Flink 管理的键控状态是一种分片的键/值存储,以及每个键/值存储的工作副本 键控状态的项保留在负责该键的 TaskManager 的本地某个位置。算子 state 也是需要它的计算机的本地状态。

Flink 管理的这种状态存储在状态后端中。 有两种状态后端的实现可用——一种基于 RocksDB,一种嵌入式键/值存储,可保持其工作状态 disk,以及另一个基于堆的状态后端,该后端将其工作状态保存在 Java 堆上的内存中。

 

名字 工作状态 快照
EmbeddedRocksDBState后端 本地磁盘(tmp 目录) 完整/增量
  • 支持大于可用内存的状态
  • 经验法则:比基于堆的后端慢 10 倍
HashMapState后端 JVM 堆
  • 快速,需要大量堆
  • 受制于GC

当使用保存在基于堆的状态后端中的状态时,访问和更新涉及读取和 在堆上写入对象。但是对于保存在 中的对象,访问和更新 涉及序列化和反序列化,因此成本要高得多。但是状态的数量 RocksDB 仅受本地磁盘大小的限制。另请注意,只有 能够执行增量快照,这对 具有大量缓慢变化状态的应用程序。EmbeddedRocksDBStateBackendEmbeddedRocksDBStateBackend

这两个状态后端都能够执行异步快照,这意味着它们可以获取 快照,而不妨碍正在进行的流处理。

检查点存储#

Flink 会定期获取每个 Operator 中所有状态的持久化快照,并将这些快照复制到更持久的地方,例如分布式文件系统。如果发生故障,Flink 可以恢复应用程序的完整状态并恢复 处理就好像什么都没出错一样。

这些快照的存储位置是通过作业检查点存储定义的。 检查点存储有两种实现可用 - 一种是持久保存其状态快照 到一个分布式文件系统,以及另一个使用 JobManager 堆的文件系统。

名字 状态备份
FileSystemCheckpointStorage 分布式文件系统
  • 支持非常大的状态大小
  • 高度耐用
  • 建议用于生产部署
JobManagerCheckpointStorage JobManager JVM 堆
  • 适用于小状态(本地)的测试和实验

返回页首

状态快照#

定义#

  • 快照 – 一个通用术语,指的是 Flink 作业状态的全局一致图像。 快照包括指向每个数据源的指针(例如,文件或 Kafka 的偏移量 partition),以及生成的每个作业的有状态运算符的状态副本 从处理所有事件到源中的这些位置。
  • Checkpoint – Flink 自动拍摄的快照,用于恢复 从故障。检查点可以是增量的,并且经过优化以快速还原。
  • 外部化检查点 – 通常检查点不应由用户操作。 Flink 只保留 n 个最新的检查点(n 是可配置的),而作业是 running,并在作业取消时删除它们。但是您可以将它们配置为保留 相反,在这种情况下,您可以手动从它们恢复。
  • 保存点 – 由用户(或 API 调用)手动触发的快照,用于某些操作 目的,例如有状态的重新部署/升级/重新缩放操作。保存点始终是完整的, 并针对操作灵活性进行了优化。

状态快照如何工作?#

Flink 使用了 Chandy-Lamport 算法的一种变体,称为异步屏障 快照

当检查点协调器(作业管理器的一部分)指示任务管理器开始 checkpoint,它让所有源记录它们的偏移量,并将编号的检查点障碍插入到他们的流中。这些障碍流经作业图,指示流的一部分 在每个检查点之前和之后。

flink通过状态快照实现容错_第1张图片

检查点 n 将包含每个运算符的状态,这些运算符因消耗了每个 检查点屏障 n 之前的事件,以及检查点屏障 n 之后的任何事件

当作业图中的每个操作员收到其中一个障碍时,它会记录其状态。运营商 使用两个输入流(例如 )执行障碍对齐,以便 快照将反映使用来自两个输入流的事件所产生的状态,直到 (但 不过去)这两个障碍。CoProcessFunction

flink通过状态快照实现容错_第2张图片 

Flink 的状态后端使用写入时复制机制来允许流处理继续 在异步拍摄旧版本状态快照时不受阻碍。只有当 快照已持久持久化,这些旧版本的状态是否会被垃圾回收。

恰好一次保证#

当流处理应用程序中出现问题时,可能会丢失或 重复的结果。使用 Flink,根据你对应用程序所做的选择,以及 运行它的集群,则以下任何结果都是可能的:

  • Flink 不会努力从故障中恢复(最多一次)
  • 不会丢失任何内容,但您可能会遇到重复的结果(至少一次))
  • 不会丢失或重复任何内容(正好一次))

鉴于 Flink 通过倒带和重放源数据流从故障中恢复,当 理想情况被描述为恰好一次这并不意味着每个事件都会 只处理一次。相反,这意味着每个事件都会影响由其管理的状态 Flink 只够一次

屏障对齐仅在提供一次保证时才需要。如果你不需要这个,你 可以通过配置 Flink 来获得一些性能,它有 禁用屏障对齐的效果。CheckpointingMode.AT_LEAST_ONCE

恰好一次端到端#

实现端到端的精确一次,以便来自源的每个事件都精确地影响接收器 一次,必须满足以下条件:

  1. 您的来源必须是可重播的,并且
  2. 接收器必须是事务性的(或幂等的)

你可能感兴趣的:(flink,大数据)