【大数据】Flink 架构(五):检查点 Checkpoint(看完即懂)

这篇具有很好参考价值的文章主要介绍了【大数据】Flink 架构(五):检查点 Checkpoint(看完即懂)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Flink 架构》系列(已完结),共包含以下 6 篇文章:

  • Flink 架构(一):系统架构
  • Flink 架构(二):数据传输
  • Flink 架构(三):事件时间处理
  • Flink 架构(四):状态管理
  • Flink 架构(五):检查点 Checkpoint(看完即懂)
  • Flink 架构(六):保存点 Savepoint

😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!

Flink 是一个分布式的数据处理系统,因此必须能够处理一些故障,例如:进程被强制关闭、机器故障以及网络连接中断。由于每个任务会把状态维护在本地,Flink 要保证发生故障时状态不丢不错

本篇博客我们将介绍 Flink 的 检查点checkpoint)及 故障恢复机制,看一下它们如何提供 精确一次 的状态一致性保障。而在下一篇博客中,我们还会讨论 Flink 所独有的 保存点savepoint)机制,它就像一把 “瑞士军刀”,解决了运行流式应用过程中的诸多难题。

1.一致性检查点

Flink 的故障恢复机制需要基于应用状态的 一致性检查点。有状态的流式应用的一致性检查点是在所有任务处理完等量的原始输入后对全部任务状态进行的一个拷贝。我们可以通过一个朴素算法对应用建立一致性检查点的过程进行解释。朴素算法的步骤包括:

  • 1️⃣ 暂停接收所有输入流。
  • 2️⃣ 等待已经流入系统的数据被完全处理,即所有任务已经处理完所有的输入数据。
  • 3️⃣ 将所有任务的状态拷贝到远程持久化存储,生成检查点。在所有任务完成自己的拷贝工作后,检查点生成完毕。
  • 4️⃣ 恢复所有数据流的接收。

注意,Flink 没有实现这种朴素策略,而是使用了一种更加复杂的检查点算法,我们会在稍后介绍该算法。

下图展示了针对一个简单应用的一致性检查点。

【大数据】Flink 架构(五):检查点 Checkpoint(看完即懂),# Flink,大数据,flink,检查点,checkpoint,状态恢复,故障恢复,保存点
该应用有一个数据源任务,负责从一个递增数字(1、2、3、…)流中读取数据。数字流会被分成奇数流和偶数流,求和算子的两个任务会分别对它们求和。数据源算子的任务 会把输入流的当前偏移量存为状态;求和算子的任务 会把当前和值存为状态。在上图中,Flink 会在输入偏移到达 5 的时候生成一个检查点,此时两个和值分别为 6 和 9。

2.从一致性检查点中恢复

流式应用执行过程中,Flink 会周期性地为应用状态生成检查点。一旦发生障,Flink 会利用最新的检查点将应用状态恢复到某个一致性的点并重启处进程。下图展示了整个恢复过程。

【大数据】Flink 架构(五):检查点 Checkpoint(看完即懂),# Flink,大数据,flink,检查点,checkpoint,状态恢复,故障恢复,保存点
应用恢复要经过 3 个步骤:

  • 1️⃣ 重启整个应用。
  • 2️⃣ 利用最新的检查点重置任务状态。
  • 3️⃣ 恢复所有任务的处理。

如果 所有算子 都将它们全部的状态写入检查点并从中恢复,并且所有输入流的消费位置都能重置到检查点生成那一刻,那么该检查点和恢复机制就能为整个应用的状态提供精确一次的一致性保障。数据源能否重置其输入流取决于它的具体实现以及所消费外部系统是否提供相关接口。例如,类似 Apache Kafka 的事件日志系统就允许从之前的某个偏移读取记录。相反,如果数据流是从套接字(socket)消费而来则无法重置,因为套接字会在数据被取走后将它们丢弃。因此只有所有输入流都是来自于可重置的数据源,应用才支持精确一次的状态一致性

应用从检查点恢复以后,它的内部状态会和生成检查点的时候完全一致。随后应用就会重新消费并处理那些从之前检查点完成开始,到发生系统故障之间已经处理过的数据。虽然这意味着 Flink 会重复处理部分消息,但上述机制仍然可以实现精确一次的状态一致性,因为所有算子的状态都会重置到过去还没有处理过那些数据的时间点。

需要强调的是,Flink 的检查点和恢复机制仅能重置 流式应用内部的状态。根据应用所采用的数据汇算子,在恢复期间,某些结果记录可能会向下游系统(如事件日志系统、文件系统或数据库)发送多次。对于某些存储系统,Flink 提供的数据汇函数支持精确一次输出,例如在检查点完成后才会把写出的记录正式提交。另一种适用于很多存储系统的方法是幂等更新。有关端到端精确一次应用所面临的挑战和解决方案会在后续有关应用一致性保障的博客中详细讨论。

3.Flink 检查点算法

Flink 的故障恢复机制需要基于应用的一致性检查点。针对流式应用,生成检查点的朴素方法就是暂停执行,生成检查点,然后恢复应用。但这种 “停止一切” 的行为,即便对于那些具有中等延迟要求的应用也很不切实际。而 Flink 的检查点是基于 Chandy-Lamport 分布式快照算法 来实现的。该算法不会暂停整个应用,而是会把生成检查点的过程和处理过程分离,这样在部分任务持久化状态的过程中,其他任务还可以继续执行。接下来我们解释一下这个算法的工作原理。

Flink 的检查点算法中会用到一类名为 检查点分隔符checkpoint barrier)的特殊记录。和水位线类似,这些检查点分隔符会通过数据源算子注入到常规的记录流中。相对其他记录,它们在流中的位置无法提前或延后。为了标识所属的检查点,每个检查点分隔符都会带有一个检查点编号,这样就把一条数据流从逻辑上分成了两个部分。所有先于分隔符的记录所引起的状态更改都会被包含在分隔符所对应的检查点之中;而所有晚于分隔符的记录所引起的状态更改都会被纳入之后的检查点中。

我们通过一个简单流式应用的示例来一步一步解释这个算法。应用包含了两个数据源任务,每个任务都会各自消费一条自增数字流。数据源任务的输出会被分成奇数流和偶数流两个部分,每一部分都会有一个任务负责对收到的全部数字求和,并将结果值更新至下游数据汇。应用细节如下图所示。

【大数据】Flink 架构(五):检查点 Checkpoint(看完即懂),# Flink,大数据,flink,检查点,checkpoint,状态恢复,故障恢复,保存点
上图拥有两个有状态的数据源、两个有状态的任务,以及两个无状态数据汇的流式应用。

如下图所示,JobManager 会向每个数据源任务发送一个新的检查点编号,以此来启动检查点生成流程。

【大数据】Flink 架构(五):检查点 Checkpoint(看完即懂),# Flink,大数据,flink,检查点,checkpoint,状态恢复,故障恢复,保存点
当一个数据源任务收到消息后,会暂停发出记录,利用状态后端触发生成本地状态的检查点,并把该检查点分隔符连同检查点编号广播至所有传出的数据流分区。状态后端会在状态存为检查点完成后通知任务,随后任务会给 JobManager 发送确认消息。在将所有分隔符发出后,数据源将恢复正常工作。通过向输出流中注入分隔符,数据源函数定义了需要在流中哪些位置生成检查点。下图展示了流式应用为数据源任务的本地状态生成检查点并发出检查点分隔符。

【大数据】Flink 架构(五):检查点 Checkpoint(看完即懂),# Flink,大数据,flink,检查点,checkpoint,状态恢复,故障恢复,保存点
数据源任务发出的检查点分隔符会传输到与之相连的任务。和水位线类似,检查点分隔符总是以广播形式发送,从而可以确保每个任务能从它们的每个输入都收到一个分隔符。当任务收到一个新检查点的分隔符时,会继续等待所有其他输入分区也发来这个检查点的分隔符。在等待过程中,它会继续处理那些从还未提供分隔符的分区发来的数据。对于已经提供分隔符的分区,它们新到来的记录会被缓冲起来,不能处理。这个等待所有分隔符到达的过程称为分隔符对齐,我们在下图中对它进行了展示。

【大数据】Flink 架构(五):检查点 Checkpoint(看完即懂),# Flink,大数据,flink,检查点,checkpoint,状态恢复,故障恢复,保存点
上图中,任务等待接收所有输入分区的分隔符,来自已接收分隔符输入分区的记录会被缓存,其他记录则按常规处理。

如下图所示,任务在收齐全部输入分区发送的分隔符后,就会通知状态后端开始生成检查点,同时把检查点分隔符广播到下游相连的任务。

【大数据】Flink 架构(五):检查点 Checkpoint(看完即懂),# Flink,大数据,flink,检查点,checkpoint,状态恢复,故障恢复,保存点
上图中,任务在收到全部分隔符后将状态存入检查点,然后向下游转发检查点分隔符。

任务在发出所有的检查点分隔符后就会开始处理缓冲的记录。待所有缓冲的记录处理完后,任务就会继续处理输入流。下图展示了此时的应用状态。

【大数据】Flink 架构(五):检查点 Checkpoint(看完即懂),# Flink,大数据,flink,检查点,checkpoint,状态恢复,故障恢复,保存点
最终检查点分隔符到达数据汇任务。数据汇任务在收到分隔符后会依次执行分隔符对齐,将自身状态写入检查点,向 JobManager 确认已接收分隔符等一系列动作。JobManager 在接收到 所有应用任务 返回的检查点确认消息后,就会将此次检查点标记为完成。下图展示了检查点算法的最后一步。如前所述,应用在发生故障时就可以利用这个生成好的检查点进行恢复。

【大数据】Flink 架构(五):检查点 Checkpoint(看完即懂),# Flink,大数据,flink,检查点,checkpoint,状态恢复,故障恢复,保存点
数据汇任务向 JobManager 确认收到检查点分隔符,在所有任务成功将自身状态存入检查点后整个应用的检查点才算完成。

4.检查点对性能的影响

虽然 Flink 的检查点算法能够在不停止整个应用的情况下为流式应用生成一致的分布式检查点,但它仍会增加应用处理延迟。Flink 实现了一些调整策略,可以减轻某些条件下对性能的影响。

任务在将其状态存入检查点的过程中,会处于阻塞状态,此时的输入会进入缓冲区。由于状态可能会很大,而且生成检查点需要把这些数据通过网络写入远程存储系统,该过程可能持续数秒,甚至数分钟。这对于一些延迟敏感的应用而言时间过久。按照 Flink 的设计,是由状态后端负责生成检查点,因此任务的状态的具体拷贝过程完全取决于状态后端的实现。举例而言,文件系统状态后端和 RocksDB 状态后端支持 异步 生成检查点。当检查点生成过程触发时,状态后端会为当前状态创建一个本地拷贝。在本地拷贝创建完成后,任务就可以继续它的常规处理。后台进程会异步将本地状态快照拷贝到远程存储,然后在完成检查点后通知任务。异步生成检查点可以有效降低任务恢复数据处理所需等待的时间。除此之外,RocksDB 状态后端还支持 增量 生成检查点,这可以有效降低需要传输的数据量。

我们还可以对分隔符对齐这一步进行调整,以降低检查点算法对处理延迟的影响。对于那些需要极低延迟且能容忍至少一次状态保障的应用,可以通过配置让 Flink 在分隔符对齐的过程中不缓冲那些已收到分隔符所对应分区的记录,而是直接处理它们。待所有的检查点分隔符都到达以后,算子才将状态存入检查点,这时候状态可能会包含一些由本应出现在下一次检查点的记录所引起的改动。一旦出现故障,这些记录会被重复处理,而这意味着检查点只能提供至少一次而非精确一次的一致性保障。文章来源地址https://www.toymoban.com/news/detail-826189.html

到了这里,关于【大数据】Flink 架构(五):检查点 Checkpoint(看完即懂)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flink 检查点配置

    开启自动保存快照 (默认:关闭) : 间隔调整 : 对性能的影响更小,就调大间隔时间 为了更好的容错性,就以调小间隔时间 检查点存储 (CheckpointStorage) : 持久化存储位置 JobManager 的堆内存 (JobManagerCheckpointStorage) : 默认 文件系统 (FileSystemCheckpointStorage) : 常用 , (HDFS , S3) Rocksdb 状

    2024年02月10日
    浏览(60)
  • 深入了解 Flink 的检查点机制

    Flink 是一个流处理框架,用于实时数据处理。检查点(checkpoint)机制是 Flink 的一个核心组件,用于保证流处理作业的可靠性和容错性。在这篇文章中,我们将深入了解 Flink 的检查点机制,涵盖其核心概念、算法原理、实例代码以及未来发展趋势。 Flink 的检查点机制是一种保存

    2024年02月20日
    浏览(39)
  • Flink状态管理与检查点机制

    本专栏案例代码和数据集链接:  https://download.csdn.net/download/shangjg03/88477960 相对于其他流计算框架,Flink 一个比较重要的特性就是其支持有状态计算。即你可以将中间的计算结果进行保存,并提供给后续的计算使用: 具体而言,Flink 又将状态 (State) 分为 Keyed State 与 O

    2024年02月07日
    浏览(49)
  • Flink流式计算状态检查点与恢复

    Flink流式计算状态检查点与恢复 Apache Flink是一个流处理框架,用于实时数据处理和分析。Flink可以处理大规模数据流,并提供一种高效、可靠的方法来处理和分析这些数据。Flink流式计算状态检查点与恢复是流处理的关键组件,它们确保Flink应用程序在故障时能够恢复并继续处

    2024年02月19日
    浏览(46)
  • 怎么理解flink的异步检查点机制

    flink的checkpoint监控页面那里有两个指标Sync Duration 和Async Duration,一个是开始进行同步checkpoint所需的时间,一个是异步checkpoint过程所需的时间,你是否也有过疑惑,是否只是同步过程中的时间才会阻塞正常的数据处理,而异步checkpoint的时间不会影响正常的数据处理流程? 这

    2024年02月09日
    浏览(61)
  • Flink系列之:背压下的检查点

    通常情况下,对齐 Checkpoint 的时长主要受 Checkpointing 过程中的同步和异步两个部分的影响。 然而,当 Flink 作业正运行在严重的背压下时,Checkpoint 端到端延迟的主要影响因子将会是传递 Checkpoint Barrier 到 所有的算子/子任务的时间。这在 checkpointing process) 的概述中有说明原因

    2024年02月04日
    浏览(45)
  • Flink---13、容错机制(检查点(保存、恢复、算法、配置)、状态一致性、端到端精确一次)

                           星光下的赶路人star的个人主页                        大鹏一日同风起,扶摇直上九万里 在Flink中,有一套完整的容错机制来保证故障后的恢复,其中最重要的就是检查点。 1.1.1 检查点的保存 1、周

    2024年02月08日
    浏览(52)
  • 209.Flink(四):状态,按键分区,算子状态,状态后端。容错机制,检查点,保存点。状态一致性。flink与kafka整合

    算子任务可以分为有状态、无状态两种。 无状态:filter,map这种,每次都是独立事件 有状态:sum这种,每次处理数据需要额外一个状态值来辅助。这个额外的值就叫“状态” (1)托管状态(Managed State)和原始状态(Raw State) 托管状态 就是由Flink统一管理的,状态的存储访问

    2024年02月06日
    浏览(52)
  • loadrunner入门教程(14)--检查点

    检查点函数原理:回放脚本时搜索特定的文本或者字符串,从而验证服务器相应的正确性;验证请求是否成功,可以添加检查点。以检查从服务器返回的内容是否正确。本任务针对脚本开发–检查点进行介绍 掌握基于loadrunner性能测试脚本开发——检查点 1.单击Design→Insert

    2024年02月05日
    浏览(66)
  • Spark基础学习笔记----RDD检查点与共享变量

    了解RDD容错机制 理解RDD检查点机制的特点与用处 理解共享变量的类别、特点与使用 当Spark集群中的某一个节点由于宕机导致数据丢失,则可以通过Spark中的RDD进行容错恢复已经丢失的数据。RDD提供了两种故障恢复的方式,分别是 血统(Lineage)方式 和 设置检查点(checkpoint)

    2024年02月06日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包