Apache Flink数据流的Fault Tolerance机制

2024-06-16 19:58

本文主要是介绍Apache Flink数据流的Fault Tolerance机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介

Apache Flink提供了一个失败恢复机制来使得数据流应用可以持续得恢复状态。这个机制可以保证即使线上环境的失败,程序的状态也将能保证数据流达到exactly once的一致性。注意这里也可以选择降级到保证at least once的一致性级别。

失败恢复机制持续地构建分布式流式数据的快照。对于那些只有少量状态的流处理应用,这些快照都是非常轻量级的并且可以以非常频繁的频率来构建快照而不需要太多地考虑性能问题。而流应用的状态被存储在一个可配置的持久化存储(比如master节点或者HDFS)。

在程序失败的情况下(比如由于机器、网络或者软件失败),Flink将停止分布式流处理。系统将重启operator并且将他们重置为最新成功了的检查点。输入流会被重置为状态快照点。任何被重启的并发数据流处理的记录,可以得到的保证是:他们不可能是检查点之前的记录。

注意:对于该机制,为了达到完整的保证,数据流source(例如message queue或者message broker)需要具备回退到最近定义的还原点的能力。Apache Kafka具备这样的能力并且Flink的Kafka连接器利用了这个能力。

因为Flink的检查点是通过分布式快照实现的,所以这里我们对快照和检查点不进行区分。

检查点

Flink的失败恢复机制最核心的部分是持续得构建分布式流处理和operator状态的快照。这些快照可以看作持续的检查点,如果发生失败的情况,系统可以从这些点进行恢复。Flink构建这些快照的机制可以被描述成分布式数据流的轻量级异步快照。它已经被实现为标准的Chandy-Lamport算法了,并用来实现分布式快照,而且几乎是为Flink的执行模型量身定做的。

屏障

Barriers:此处统一称为屏障也可称之为栅栏

在Flink的分布式快照机制中有一个核心的元素是流屏障。屏障作为数据流的一部分随着记录被注入到数据流中。屏障永远不会赶超通常的流记录,它会严格遵循顺序。屏障将数据流中的记录隔离成一系列的记录集合,并将一些集合中的数据加入到当前的快照中,而另一些数据加入到下一个快照中。每一个屏障携带着快照的ID,快照记录着ID并且将其放在快照数据的前面。屏障不会中断流处理,因此非常轻量级。来自不同快照的多个屏障可能同时出现在流中,这意味着多个快照可能并发地发生。

flink-stream-fault-tolerance_stream-barriers

stream source中,流屏障被注入到并发数据流中。快照n被注入屏障的点(简称为Sn),是在source stream中的数据已被纳入该快照后的位置。例如,在Apache Kafka中,该位置将会是partition中最后一条记录的offset。这个Sn的位置将被报告给检查点协调器Flink JobManager)。

屏障接下来会流向下游。当一个中间的operator从所有它的输入流中接收到一个来自快照n的屏障,它自身发射一个针对快照n的屏障到所有它的输出流。一旦一个sink operator(流DAG的终点)从它所有的输入流中接收到屏障n,它将会像检查点协调器应答快照n。在所有的sink应答该快照后,它才被认为是完成了。

当快照n完成后,可以认为在Sn之前的记录没有必要再从source中流入,因为这些记录已经穿过了整个数据流的处理拓扑。

flink-stream-fault-tolerance_stream-aligning

那些不止一个输入流的的operator需要在快照屏障上对齐(align)输入流。上面的插图说明了这一点:

  • 一旦operator从外来流中收到快照屏障n,它就不能处理该流中更多的记录直到它从其他输入中接收到屏障n。否则,会混合属于快照n以及快照n+1的记录
  • 汇报过屏障n的流会被临时搁置到一边,从这些流中继续接收到的记录并没有被处理,而是被放进一个输入缓冲区中
  • 一旦最后一个流接收到屏障n,operator发射所有待处理的需要流出的记录,然后发射快照n屏障本身
  • 此后,operator恢复从所有输入流的记录的处理,在处理来自流的记录之前先处理来自输入缓冲区的记录

状态

无论operator包含任何形式的状态,这些状态必须是快照的一部分。operator状态有不同的形式:

  • 用户定义的状态:这种类型的状态通过transformation函数(比如map()或者filter())直接创建和修改。用户定义的状态可以是一个简单的变量或者跟某个函数关联的key/value状态。
  • 系统状态:这种状态通常关系到数据缓冲区,它们是operator计算逻辑的一部分。这种状态的一个典型的例子是window buffers,在它内部,系统为其收集(以及聚合)记录直到窗口被计算。

operator在从它们的所有输入流中收到所有的快照屏障时,在发射屏障到它们的输出流之前会对状态做快照在那个点,所有在屏障之前的记录的状态更新必须完成,并且在屏障之后依赖于记录的更新不会被接收。因为快照的状态有可能会非常大,它们被存储在可配置的状态终端上。默认存储的位置是JobManager的内存,但为了严谨,应该配置一个分布式的可靠的存储层(比如HDFS)。在状态被存储之后,operator会应答检查点,发射快照屏障到输出流并继续处理流程。

现在快照的结果包含:

  • 对每个并行流的数据源而言,快照开始时的偏移量或者位置
  • 对每个operator而言,一个指针指向存储在快照中的状态部分

flink-stream-fault-tolerance_checkpointing-1

flink-stream-fault-tolerance_checkpointing-2

恰好一次VS至少一次

对齐步骤可能会增加流处理的延迟。通常这个额外的延迟被控制在毫秒级,但我们也看到一些场景下,延迟显著增加。对于那些要求针对所有记录的处理始终保持低延迟的应用(比如几毫秒),Flink提供了一个开关(选项)可以在检查点中跳过流对齐。检查点快照仍然被构建,一旦operator从每个输入流收到检查点屏障。

对齐操作被跳过,operator持续处理所有的输入,甚至在检查点n的一些检查点屏障到达之后。这种情况下,operator在对检查点n进行状态快照之前也可能同时会处理属于检查点n+1的元素。因此,在恢复时,这些记录可能会导致重复因为它们可能会既包含在针对检查点n的快照中,又将包含在检查点n之后被重放的部分数据中。

注意:对齐仅仅发生在operator有多个前置operator(join)以及operator有多个发送者(在一个流被repartitioning/shuffle之后)。正因为如此,令人尴尬的是,在数据流中仅仅只有一个并行的流操作(map(),flatMap(),filter()…)时,即便在至少一次的模式下也能提供恰巧一次的一致性保证。

恢复

在这个机制下的恢复是很简单的:如果产生了失败,Flink选择最近完成的检查点K。然后系统重放整个分布式的数据流,然后给予每个operator他们在检查点k快照中的状态。数据源被设置为从位置Sk开始重新读取流。例如在Apache Kafka中,那意味着告诉消费者从偏移量Sk开始重新消费。

如果状态被增量地快照,operator从最新的完整快照中读取状态然后在状态上应用一系列的增量快照更新。

本文翻译自:https://ci.apache.org/projects/flink/flink-docs-master/internals/stream_checkpointing.html

这篇关于Apache Flink数据流的Fault Tolerance机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1067399

相关文章

Linux系统稳定性的奥秘:探究其背后的机制与哲学

在计算机操作系统的世界里,Linux以其卓越的稳定性和可靠性著称,成为服务器、嵌入式系统乃至个人电脑用户的首选。那么,是什么造就了Linux如此之高的稳定性呢?本文将深入解析Linux系统稳定性的几个关键因素,揭示其背后的技术哲学与实践。 1. 开源协作的力量Linux是一个开源项目,意味着任何人都可以查看、修改和贡献其源代码。这种开放性吸引了全球成千上万的开发者参与到内核的维护与优化中,形成了

Spring中事务的传播机制

一、前言 首先事务传播机制解决了什么问题 Spring 事务传播机制是包含多个事务的方法在相互调用时,事务是如何在这些方法间传播的。 事务的传播级别有 7 个,支持当前事务的:REQUIRED、SUPPORTS、MANDATORY; 不支持当前事务的:REQUIRES_NEW、NOT_SUPPORTED、NEVER,以及嵌套事务 NESTED,其中 REQUIRED 是默认的事务传播级别。

53、Flink Interval Join 代码示例

1、概述 interval Join 默认会根据 keyBy 的条件进行 Join 此时为 Inner Join; interval Join 算子的水位线会取两条流中水位线的最小值; interval Join 迟到数据的判定是以 interval Join 算子的水位线为基准; interval Join 可以分别输出两条流中迟到的数据-[sideOutputLeftLateData,

多头注意力机制(Multi-Head Attention)

文章目录 多头注意力机制的作用多头注意力机制的工作原理为什么使用多头注意力机制?代码示例 多头注意力机制(Multi-Head Attention)是Transformer架构中的一个核心组件。它在机器翻译、自然语言处理(NLP)等领域取得了显著的成功。多头注意力机制的引入是为了增强模型的能力,使其能够从不同的角度关注输入序列的不同部分,从而捕捉更多层次的信息。 多头注意力机

Linux-笔记 线程同步机制

目录 前言 实现 信号量(Semaphore) 计数型信号量 二值信号量  信号量的原语操作 无名信号量的操作函数 例子 互斥锁(mutex) 互斥锁的操作函数 例子 自旋锁 (Spinlock) 自旋锁与互斥锁的区别 自旋锁的操作函数 例子 前言         线程同步是为了对共享资源的访问进行保护,确保数据的一致性,由于进程中会有多个线程的存在,

Spring 集成 RabbitMQ 与其概念,消息持久化,ACK机制

目录 RabbitMQ 概念exchange交换机机制 什么是交换机binding?Direct Exchange交换机Topic Exchange交换机Fanout Exchange交换机Header Exchange交换机RabbitMQ 的 Hello - Demo(springboot实现)RabbitMQ 的 Hello Demo(spring xml实现)RabbitMQ 在生产环境

Rust:Future、async 异步代码机制示例与分析

0. 异步、并发、并行、进程、协程概念梳理 Rust 的异步机制不是多线程或多进程,而是基于协程(或称为轻量级线程、微线程)的模型,这些协程可以在单个线程内并发执行。这种模型允许在单个线程中通过非阻塞的方式处理多个任务,从而实现高效的并发。 关于“并发”和“并行”的区别,这是两个经常被提及但含义不同的概念: 并发(Concurrency):指的是同时处理多个任务的能力,这些任务可能在同一时

ROS话题通信机制实操C++

ROS话题通信机制实操C++ 创建ROS工程发布方(二狗子)订阅方(翠花)编辑配置文件编译并执行注意订阅的第一条数据丢失 ROS话题通信的理论查阅ROS话题通信流程理论 在ROS话题通信机制实现中,ROS master 不需要实现,且连接的建立也已经被封装了,需要关注的关键点有三个: 发布方(二狗子)订阅方(翠花)数据(此处为普通文本) 创建ROS工程 创建一个ROS工程

修改wamp的apache默认端口80以及www目录

转自:http://blog.csdn.net/daydreamingboy/article/details/6247592 修改wamp的apache默认端口80以及www目录 以修改为8088端口和D:/workphp目录为例。 1. 修改为8088端口 左键托盘图标,在“Apache”里可以直接打开httpd.conf,查找到“Listen 80”,可以改成其他端口,我选用808

Java面试题:内存管理、类加载机制、对象生命周期及性能优化

1. 说一下 JVM 的主要组成部分及其作用? JVM包含两个子系统和两个组件:Class loader(类装载)、Execution engine(执行引擎)、Runtime data area(运行时数据区)、Native Interface(本地接口)。 Class loader(类装载):根据给定的全限定名类名(如:java.lang.Object)装载class文件到Runtim