Flink中的状态一致性

1.概念

  一致性其实就是结果的正确性。对于分布式系统而言,从不同节点读取时总能得到相同的值;而对于事务而言,是要求提交更新操作后,能够读取到新的数据。

  • 有状态的流处理,内部每个算子任务都可以有自己的状态。
  • 对于流处理内部来说,所谓状态一致性,其实就是所说的计算结果要保证准确。
  • 一条数据不应该丢失,也不应该重复计算。
  • 在遇到故障时可以状态恢复,恢复以后重新计算,计算结果也是完全正确的。

2.一致性级别

  • AT-MOST-ONCE(最多一次)
  • 当任务发生故障时,直接重启,别的什么都不干;既不恢复丢失的状态,也不重放丢失的数据。每条数据在正常情况下会被处理一次,遇到故障时就会丢掉。即为每条消息就只消费一次。
  • AT-LEAST-ONCE(至少一次)
    • 所有的数据都不会丢,肯定被处理了;不过不能保证只处理一次,有些数据会被重复处理。在某些场景下,重复处理数据是不会影响结果的正确性。比如:统计某电商网站的UV。
  • EXACTLY-ONCE(精确一次
    • 所有数据不仅不会丢失,而且只会被处理一次,不会重复处理。Flink中使用的是一种轻量级快照机制—检查点(checkpoint)来保证exactly-once语义。

3.端到端精确一次(end-to-end exactly-once)

  对于Flink内部来说,检查点机制可以保证故障恢复之后数据不丢(在能够重复放的情况下),并且只处理一次,所以已经可以做到exactly-once的一致性语义了。故端到端一致性的关键点,就在于输入的数据源端和输出的外部存储端。

3.1 输入端保证

  输入端主要指的就是Flink读取的外部数据源。想要在故障恢复后不丢数据,外部数据源就必须拥有重放数据的能力。常见做法就是对数据进行持久化保存,并且可以重设数据的读取位置。一个最经典的应用就是Kafka。在Flink的Source任务中将数据读取的偏移量保存为状态,这样就可以在故障恢复时从检查点中读取出来,对数据源重置偏移量,重新获取数据。

3.2 输出端保证

  输出端主要指的就是Flink处理完数据,通过sink任务输出到外部系统。对于输出端,需要保证在故障恢复时,数据不会重复写入外部系统。对于输出端,有两种 具体的实现方式:幂(Idempotent)写入和事务性(Transactional)写入。

3.2.1 幂等(idempotent)写入

  所谓“幂等”操作,就是说一个操作可以重复执行很多次,但只导致一次结果更改。这种方式主要限制在于外部存储系统必须支持这样的幂等写入。

  对于幂等写入,在遇到故障恢复时,可能会出现短暂的不一致。因为保存点完成之后到发生故障之间的数据,其实已经写入了一遍,回滚的时候并不能消除它们。不过当数据的重放逐渐超过发生故障的点的时候,最终的结果还是一致的。

3.2.2 事务(transaction)写入

  输出端最大的问题,就是写入到外部系统的数据难以撤回。而利用事务就可以实现对已写入数据的撤回。在Flink流处理的结果写入外部系统时,如果能够构建一个事务,让写入操作可以随着检查点来提交和回滚,这样就解决了重复写入的问题。 事务与检查点是绑定在一起的,当Sink任务遇到barrier时,开始保存状态的同时就开启一个事务,后续所有数据的写入都在该事务中;待到当前检查点保存完毕时,将事务提交,所有写入的数据就真正可用了。如果中间过程出现故障,状态会回退到上一个检查点,而当前事务没有正常关闭(因为当前检查点没有保存完),所以也会回滚,写入到外部的数据就被撤销了。对于事务写入有两种实现方式:预写日志(WAL)和两阶段提交(2PC)。

预写日志(write-ahead-log,WAL)

实现步骤:

  1. 先把结果数据作为日志(log)状态保存起来;
  2. 进行检查点保存时,同时将这些结果数据做持久化存储;
  3. 在收到检查点完成的通知时,将所有结果一次性写入外部系统。

  预写日志这种批写入的方式,有可能会写入失败;所以在写入动作之后,必须等待发送成功的返回确认消息。在成功写入所有数据后,内部再次确认相应的检查点,此时代表着检查点的真正完成。同时也需要确认信息也进行持久化保存,在故障恢复时,只有存在对应的确认信息,才能保证这批数据已经写入,可以恢复到对应的检查点位置。

两阶段提交(two-phase-commit,2PC)

  两阶段提交,顾名思义,先做“预提交”,等检查点完成之后再正式提交。这种提交方式是真正基于事务的,它需要外部系统提供事务支持。

实现步骤:

  1. 当第一条数据到来时,或者收到检查点的分界线时,Sink任务都会启动一个事务。
  2. 接下来接收到的所有数据,都通过这个事务写入外部系统;这时由于事务没有提交,数据虽然写入了外部系统,但是不可用,是“预提交”的状态。
  3. 当Sink任务收到JobManager发来检查点完成的通知时,正式提交事务,写入的结果就真正可用了。

  当中间发生故障时,当前未提交的事务就会回滚,于是所有写入外部系统的数据也就实现了撤回。两阶段提交的方式充分利用了Flink现有的检查点机制:分界线的到来,就标志着开始一个新事务;而收到来自JobManager的checkpoint成功的消息,就是提交事务的指令。

两阶段提交对外部系统有要求:

  • 外部系统必须提供事务支持,或者Sink任务必须能够模拟外部系统上的事务。
  • 在检查点的间隔期间里,必须能够开启一个事务并接受数据写入。
  • 在收到checkpoint完成的通知之前,事务必须是“等待提交”的状态。在故障恢复的情况下,这可能需要-些时间。如果这个时候sink系统关闭事务(例如超时了) ,那么未提交的数据就会丢失
  • sink任务必须能够在进程失败后恢复事务 。
  • 提交事务必须是幂等操作。

3.3 总结

对于端到端的精准一次而言:

系统要求
source端可重设数据的读取位置
Flink内部依赖checkpoint
sink端从故障恢复时,数据不会重复写入外部系统

4.Flink和Kafka连接时的精确一次保证

4.1 概述

  Flink与Kafka连接时属于端到端精准一次,可以从三个组件的角度进行分析:

  • Flink内部
    • 通过checkpoint机制, 把状态存盘,发生故障的时候可以恢复,保证内部的状态一致性。
  • 输入端
    • 输入数据源端的Kafka可以对数据进行持久化保存,并可以重置偏移量(offset)。在Source任务(FlinkKafkaConsumer)中将当前读取的偏移量保存为算子状态,写入到检查点中;当发生故障时,从检查点中读取恢复状态,并由连接器FlinkKafkaConsumer向Kafka重新提交偏移量,就可以重新消费数据、保证结果的一致性了。
  • 输出端
    • 输出端保证exactly-once的最佳实现,当然就是两阶段提交(2PC)。Flink官方实现的Kafka连接器中,提供了写入到Kafka的FlinkKafkaProducer,它就实现TwoPhaseCommitSinkFunction接口。
    • 两阶段提交:处理完毕得到结果,写入Kafka时是基于事务的“预提交”;等到检查点保存完毕,才会提交事务进行“正式提交”。

4.2 2PC具体步骤

情景: 由Flink从Kafka读取数据、并将处理结果写入Kafka,如图所示

在这里插入图片描述

  Flink与Kafka连接的两阶段提交,离不开检查点的配合,这个过程需要JobManager协调各个TaskManager进行状态快照,而检查点具体存储位置则是由状态后端(State Backend)来配置管理的。一般情况,我们会将检查点存储到分布式文件系统上。

(1) 启动检查点保存

  检查点保存的启动,标志着进入了两阶段提交协议的“预提交”阶段。当然,现在还没有具体提交的数据。

在这里插入图片描述

  JobManager通知各个TaskManager启动检查点保存,Source任务会将检查点分界线(barrier)注入数据流。这个barrier可以将数据流中的数据,分为进入当前检查点的集合和进入下一个检查点的集合。

(2) 算子任务对状态做快照

  分界线(barrier)会在算子间传递下去。每个算子收到barrier时,会将当前的状态做个快照,保存到状态后端。

在这里插入图片描述

  Source任务将barrier插入数据流后,也会将当前读取数据的偏移量作为状态写入检查点,存入状态后端;然后把barrier向下游传递,自己就可以继续读取数据了。接下来barrier传递到了内部的Window算子,它同样会对自己的状态进行快照保存,写入远程的持久化存储。

(3) Sink任务开启事务,进行预提交

在这里插入图片描述

  分界线(barrier)终于传到了Sink任务,这时Sink任务会开启一个事务。后续到来的所有数据,Sink任务都会通过该事务来写入Kafka。这里barrier是检查点的分界线,也是事务的分界线。由于之前的检查点可能尚未完成,因此上一个事务也可能尚未提交;此时barrier的到来开启了新的事务,上一个事务尽管可能没有被提交,但也不再接收新的数据了。

  对于Kafka而言,提交的数据会被标记为“未确认”(uncommitted)。这个过程就是所谓的“预提交”(pre-commit)。

(4) 检查点保存完成,提交事务

  当所有算子的快照都完成,也就是这次的检查点保存最终完成时,JobManager会向所有任务发确认通知,告诉TaskManager当前检查点已成功保存。

在这里插入图片描述

  当Sink任务收到确认通知后,就会正式提交之前的事务,把之前“未确认”的数据标为“已确认”,接下来就可以正常消费了。

4.3 需要的配置

  • 必须启用checkpoint。
  • 在FlinkKafkaProducer的构造函数中传入参数Semantic.EXACTLY_ONCE。
  • 配置Kafka(写入的外部系统)读取数据的消费者的隔离级别:isolation.level=read_commited。
  • 事务超时配置:Flink的Kafka连接器中配置的事务超时时间transaction.timeout.ms默认是1小时,而Kafka集群配置的事务最大超时时间transaction.max.timeout.ms默认是15分钟。实际配置应该是:transaction.timeout.ms≤transaction.max.timeout.ms。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/91494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Source Insight 工具栏图标功能介绍

这篇文章并不介绍 Source Insight 的具体使用方法,这类教程网上有很多,这里只分析 Souce Insight 工具栏图标的功能。 文章目录 Source Insight 简介Souce Insight 工具栏文件操作新建(CtrlN)打开(CtrlO)保…

Java 实现遍历一个文件夹,文件夹有100万数据,获取到修改时间在2天之内的数据

目录 1 需求2 实现1(第一种方法)2 实现2 (推荐使用这个,快)3 实现3(推荐) 1 需求 现在有一个文件夹,里面会一直存数据,动态的存数据,之后可能会达到100万&am…

【PyTorch实战演练】使用Cifar10数据集训练LeNet5网络并实现图像分类(附代码)

文章目录 0. 前言1. Cifar10数据集1.1 Cifar10数据集下载1.2 Cifar10数据集解析 2. LeNet5网络2.1 LeNet5的网络结构2.2 基于PyTorch的LeNet5网络编码 3. LeNet5网络训练及输出验证3.1 LeNet5网络训练3.2 LeNet5网络验证 4. 完整代码4.1 训练代码4.1 验证代码 0. 前言 按照国际…

紫光同创FPGA图像视频采集系统,基于OV7725实现,提供工程源码和技术支持

目录 1、前言免责声明 2、设计思路框架视频源选择OV7725摄像头配置及采集动态彩条HDMA图像缓存输入输出视频HDMA缓冲FIFOHDMA控制模块HDMI输出 3、PDS工程详解4、上板调试验证并演示准备工作静态演示动态演示 5、福利:工程源码获取 紫光同创FPGA图像视频采集系统&am…

mysql面试题7:MySQL事务原理是什么?MySQL事务的隔离级别有哪些?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:MySQL事务原理是什么? MySQL事务的原理是基于ACID(原子性、一致性、隔离性、持久性)特性来实现的,具体原理如下: Atomicity(原子性):事务…

给奶牛做直播之三

​一、前言 上一篇给牛奶做直播之二 主要讲用RTMP搭建点播服务器,整了半天直播还没上场,今天不讲太多理论的玩意,奶牛今天放假了也不出场,就由本人亲自上场来个直播首秀,见下图,如果有兴趣的话&#xff0…

YOLOV8-DET转ONNX和RKNN

目录 1. 前言 2.环境配置 (1) RK3588开发板Python环境 (2) PC转onnx和rknn的环境 3.PT模型转onnx 4. ONNX模型转RKNN 6.测试结果 1. 前言 yolov8就不介绍了,详细的请见YOLOV8详细对比,本文章注重实际的使用,从拿到yolov8的pt检测模型&…

施耐德电气:勾勒未来工业愿景,赋能中国市场

9月19日,第23届中国国际工业博览会(简称“工博会”)在上海隆重召开。作为全球能源管理和自动化领域的数字化转型专家,施耐德电气在工博会现场全方位展现了自身对未来工业的全新视野与深刻见解,不仅展示了其贯通企业设计…

字节一面:深拷贝浅拷贝的区别?如何实现一个深拷贝?

前言 最近博主在字节面试中遇到这样一个面试题,这个问题也是前端面试的高频问题,我们经常需要对后端返回的数据进行处理才能渲染到页面上,一般我们会讲数据进行拷贝,在副本对象里进行处理,以免玷污原始数据&#xff0c…

arduino - UNO-R3,mega2560-R3,NUCLEO-H723ZG的arduino引脚定义区别

文章目录 arduino - UNO-R3,mega2560-R3,NUCLEO-H723ZG的引脚定义区别概述笔记NUCLEO-H723ZGmega2560-R3UNO-R3经过比对, 这2个板子(NUCLEO-H723ZG, mega2560-R3)都是和UNO-R3的arduino引脚定义一样的.mega2560-r3和NUCLEO-H723ZG的区别补充arduino uno r3的纯数字IO和模拟IO作…

uniapp iOS离线打包——原生工程配置

uniapp iOS离线打包,如何配置项目工程? 文章目录 uniapp iOS离线打包,如何配置项目工程?工程配置效果图DebugRelease 配置工程配置 Appkey应用图标模块及三方SDK配置未配置模块错误配置模块TIP: App iOS 离线打包 前提&#xff1a…

Linux服务器安装Anaconda 配置远程jupyter lab使用虚拟环境

参考的博客: Linux服务器安装Anaconda 并配置远程jupyter lab anaconda配置远程访问jupyter,并创建虚拟环境 理解和创建:Anaconda、Jupyterlab、虚拟环境、Kernel 下边是正文了。 https://www.anaconda.com/download是官网网址,可…

华为云云耀云服务器L实例评测|云耀云服务器L实例部署Linux管理面板mdserver-web

华为云云耀云服务器L实例评测|云耀云服务器L实例部署Linux管理面板mdserver-webl 一、云耀云服务器L实例介绍1.1 云耀云服务器L实例简介1.2 云耀云服务器L实例特点 二、mdserver-web介绍2.1 mdserver-web简介2.2 mdserver-web特点2.3 主要插件介绍 三、本次实践介绍…

机器学习之单层神经网络的训练:增量规则(Delta Rule)

文章目录 权重的调整单层神经网络使用delta规则的训练过程 神经网络以权值的形式存储信息,根据给定的信息来修改权值的系统方法称为学习规则。由于训练是神经网络系统地存储信息的唯一途径,因此学习规则是神经网络研究中的一个重要组成部分 权重的调整 &#xff08…

iPhone数据丢失怎么办?9 佳免费 iPhone 数据恢复软件可收藏

您是否知道有多种原因可能导致 iPhone 上存储的数据永久丢失?然而,使用一些最好的免费 iPhone 数据恢复软件,您仍然可以恢复它。 由于我们几乎总是保存手机上的所有内容(从联系人到媒体文件),因此 iPhone …

CDH 6.3.2升级Flink到1.17.1版本

CDH:6.3.2 原来的Flink:1.12 要升级的Flink:1.17.1 操作系统:CentOS Linux 7 一、Flink1.17编译 build.sh文件: #!/bin/bash set -x set -e set -vFLINK_URLsed /^FLINK_URL/!d;s/.*// flink-parcel.properties FLI…

龙迅LT9611UXC 2PORT MIPICSI/DSI转HDMI(2.0)转换器+音频,内置MCU

龙迅LT9611UXC 1.描述: LT9611UXC是一个高性能的MIPI DSI/CSI到HDMI2.0转换器。MIPI DSI/CSI输入具有可配置的单 端口或双端口,1高速时钟通道和1~4高速数据通道,最大2Gbps/通道,可支持高达16Gbps的总带 宽。LT9611UXC支持突发…

智算创新,美格智能助力智慧支付加速发展

9月21日,以“智算引领创新未来”为主题的紫光展锐2023泛物联网终端生态论坛在深圳举行。作为紫光展锐重要战略合作伙伴,美格智能标准模组产品线总经理郭强华、高级产品总监刘伟鹏受邀出席论坛。美格智能基于紫光展锐5G、4G、智能SoC、Cat.1 bis等芯片平台…

麒麟信安服务器操作系统V3.5.2重磅发布!

9月25日,麒麟信安基于openEuler 22.03 LTS SP1版本的商业发行版——麒麟信安服务器操作系统V3.5.2正式发布。 麒麟信安服务器操作系统V3定位于电力、金融、政务、能源、国防、工业等领域信息系统建设,以安全、稳定、高效为突破点,满足重要行…

图像语义分割 U-Net图像分割网络详解

图像语义分割 U-Net图像分割网络详解 简介原始论文中的网络结构在医学方面的应用pytorch官方实现以DRIVE眼底血管分割数据集训练U-Net语义分割网络模型U-Net网络训练损失函数 简介 U-Net网络非常的简单,前半部分就是特征提取,后半部分是上采样。在一些文…