【Flink系列六】Flink里面的状态一致性

状态一致性

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

状态一致性的分类

  • AT-MOST-ONCE(最多一次)
    • 当任务故障时,最简单的做法是什么都不干,既不恢复丢失的状态,也不重复丢失的数据。At-most-once语义的含义是最多处理一次事件
  • AT-LEAST-ONCE(至少一次)
    • 在大多数的真实应用场景,我们希望不丢失事件。这种类型称为at-least-once,意思是所有的事件都得到了处理,而一些事件还可能被处理多次
  • EXACTLY-ONCE(精确一次)
    • 恰好处理一次是最严格的保证,也是最难实现的。恰好处理一次的语义不仅仅意味着没有发生事件丢失,还意味着针对每一个数据,内部状态仅仅更新一次。

一致性检查点(checkpoint)

 Flink 的 Checkpoint 机制是其可靠性的基石。当一个任务在运行过程中出现故障时,可以根据 Checkpoint 的信息恢复到故障之前的某一状态,然后从该状态恢复任务的运行。 在 Flink 中,Checkpoint 机制采用的是 chandy-lamport(分布式快照)算法,通过 Checkpoint 机制,保证了 Flink 程序内部的 Exactly Once 语义

和上文一样的图,大家可以自行理解(戳我直达)

端到端(end-to-end)状态一致性

目前我们看到的一致性保证都是由流处理实现的,也就是说都是在Flink流处理内部保证的;而在真实的应用中,流处理应用除了流处理器以外还包含数据源(例如kafka)和输出到持久化系统。端到端的一致性保证意味着结果的正确性贯穿六整个流处理应用的始终;每一个组件都保证了它自己的一致性。整个端到端的一致性取决于所有组件中一致性最弱的组件

端到端的精确一次(exactly-once)保证

  • 内部保证 -----checkpoint
  • source端 -----可重设置数据的读取位置
  • sink端 -----从故障恢复时,数据不会重复写入外部系统
    • 幂等写入
    • 事务写入

(比如上篇文章说的,处理到数据6,7的时候任务挂了,从checkpoint=5恢复,会重新消费6、7的数据,端到端的状态一致性保证,并不意味着不重复处理数据)

幂等写入(Idempotent Write)

所谓的幂等操作,是一个操作,可以重复执行很多次,但只导致一次结果更改,也就是说后面重复执行就不起作用了。比如HashMap,一个key多次写入,产生的效果是一样的。

事务写入(Transaction Write)
  • 应用程序中一系列操作,所有操作必须全部成功,否则在每个操作中所有的更改都会被撤销;具有原子性,要么都成功,要么都失败。

实现思想:构建事务对应着checkpoint,等到checkpoint真正完成的时候,才把对应的结果写入Sink系统中。

实现方式:1-预写日志(Write-Ahead-Log WAL),2-两阶段提交(Two-Phase-Commit 2PC)

  1. 预写日志,把结果数据先当作状态保存,然后在收到checkpoint完成的通知时,一次性写入sink系统。简单且易于实现,由于数据提前在状态后端中做了缓存,所以无论什么时候sink系统,都能使用这种方式一批搞定。DataStreamAPI提供了一个模版类:GenericWriteAheadSink
  2. 两阶段提交(Two-Phase-Commit 2PC):
    1. 对于每个checkpoint,sink任务会启动一个事物,并将接下来所有接受的数据添加到事务里。然后将这些数据写入外部sink系统,但不提交他们-----这时只是“预提交”
    2. 当它们收到checkpoint完成的通知时,它才正式提交事务,实现结果的真正写入

这种方式真实实现了exactly-once,它需要一个提供事务支持的外部sink系统。Flink提供了TwoPhaseCommitSinkFunction接口。

2PC 对外部sink系统的要求

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

不同的Source和Sink的一致性保证

Flink-Kafka端到端的一致性保证

  • 内部-----利用checkpoint机制,把状态存盘,发生故障的时候可以恢复,保证内部状态的一致性
  • source -----kafka consumer作为source,可以将偏移量保存下来,如果后续出现故障,恢复的时候可以由连接器重置偏移量,重新消费数据,保证一致性
  • sink -----kafka producer 作为sink,采用两阶段提交sink,需要实现一个TwoPhaseCommitSinkFunction

以kafka举例

  1. JobManager协调各个TaskManager进行checkpoint存储,checkpoint保存在StateBackend中,默认StateBackend是内存级的,也可以改为文件级的进行持久化保存
  2. 当checkpoint启动时,JobManager会将检查点分界线(barrier)注入到数据流,barrier在算子之间传递下去
  3. 当barrier到达时,算子会对当前的状态做一个快照,保存到状态后端(StateBackend),checkpoint机制可以保证内部的状态一致性
  4. 每个内部的transform任务遇到barrier时,都会把状态存到checkpoint里;sink任务首先是把数据写入到外部kafka,这些数据都是属于预提交的事务;遇到barrier时,把状态保存到状态后端,并开启新的预提交事务。

------此时checkpoint过程还未结束,只是算子任务的快照完成了

  1. 当所有算子任务的快照完成,也就是这次的checkpoint完成时,JobManager会向所有任务发送通知,确认这次checkpoint完成
  2. sink任务收到确认通知,正视提交之前的事务,kafka中的未确认数据改为“已确认”

这里也设计2PC的提交步骤,我们一起来列举一下

  1. 第一条数据来了之后,开启Kafka的事务,正常写入kafka分区日志但标记未提交,这就是“预提交”
  2. JobManager触发checkpoint操作,barrier从source开始向下传递,遇到barrier的算子将状态存入状态后端,并通知JobManager
  3. sink连接器收到barrier,保存当前状态,存入checkpoint,通知JobManager,并开始下一阶段的事务,用于提交下一个检查点的数据
  4. JobManager收到所有任务的通知,发出确认信息,标识checkpoint完成
  5. sink任务收到JobManager的确认消息,正视提交这段时间的数据
  6. 外部Kafka关闭事务,提交的数据可以正常消费了

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

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

相关文章

RabbitMQ 常见面试题

目录 1.前置知识1.1.什么是 MQ?它有什么作用?1.2.什么是消费者生产者模型?1.3.AMQP 是什么? 2.RabbitMQ 入门2.1.什么是 RabbitMQ?有什么特点?2.2.RabbitMQ 的核心概念有哪些?2.2.1.生产者 (Pro…

css 元素前后添加图标(::before 和 ::after 的妙用)

<template><div class"container"><div class"label">猜你喜欢</div></div> </template><style lang"scss" scoped> .label {display: flex;&::before,&::after {content: "";widt…

《实战:如何使用Vue2.0开发一个npm组件库》- 6、Vue2.x 组件 webpack3 升 webpack5

升级 package.json 删除冗余依赖 "extract-text-webpack-plugin": "^3.0.2","vue-loader": "^13.0.5", "vue-template-compiler": "^2.4.4", "webpack": "^3.6.0", "webpack-dev-serv…

LLM之RAG实战(二):使用LlamaIndex + Metaphor实现知识工作自动化

最先进的大型语言模型&#xff08;LLM&#xff09;&#xff0c;如ChatGPT、GPT-4、Claude 2&#xff0c;具有令人难以置信的推理能力&#xff0c;可以解锁各种用例——从洞察力提取到问答&#xff0c;再到通用工作流自动化。然而&#xff0c;他们检索上下文相关信息的能力有限。…

[论文阅读]BEVFusion

BEVFusion BEVFusion: A Simple and Robust LiDAR-Camera Fusion Framework BEVFusion&#xff1a;简单而强大的激光雷达相机融合框架 论文网址&#xff1a;BEVFusion 论文代码&#xff1a;BEVFusion 简读论文 论文背景&#xff1a;激光雷达和摄像头是自动驾驶系统中常用的两…

UE Http笔记

c参考链接 UE4 开发如何使用 Http 请求_wx61ae2f5191643的技术博客_51CTO博客 虚幻引擎:UEC如何对JSON文件进行读写?-CSDN博客 UE4 HTTP使用 官方免费插件 VaRest 在代码插件创建的VaRest - 虚幻引擎商城 UE5在蓝图中使用Varest插件Get&#xff0c;Post两种常见请求方式…

webpack学习-3.管理输出

webpack学习-3.管理输出 1.简单练手2.设置 HtmlWebpackPlugin3.清理 /dist 文件夹4.manifest5.总结 1.简单练手 官网的第一个预先准备&#xff0c;是多入口的。 const path require(path);module.exports {entry: {index: ./src/index.js,print: ./src/print.js,},output: …

axios调接口传参特殊字符丢失的问题(encodeURI 和 encodeURIComponent)

1、axios调接口特殊字符丢失的问题 项目开发过程中遇到一个接口传参&#xff0c;参数带特殊字符&#xff0c;axios调接口特殊字符丢失的问题 例如接口&#xff1a; get/user/detail/{name} name是个参数直接调接口的时候拼到接口上&#xff0c;get/user/detail/test123#$%&am…

计算机网络中的通信子网:架构、协议与技术简介

在计算机网络中&#xff0c;通信子网是负责实现主机之间以及主机与终端之间数据传输的核心部分。它由一系列硬件设备和通信协议组成&#xff0c;为上层应用提供可靠、高效和透明的数据传输服务。本文将详细介绍通信子网的架构、协议与技术。 一、通信子网的架构 星型拓扑 星…

华为配置Smart Link负载分担示例

Smart Link基本概念 Smart Link通过两个端口相互配合工作来实现功能。这样的一对端口组成了一个Smart Link组。为了区别一个Smart Link组中的两个端口&#xff0c;我们将其中的一个叫做主端口&#xff0c;另一个叫做从端口。同时我们利用Flush报文、Smart Link实例和控制VLAN等…

Matlab 点云曲线探测(算法不稳定,仅用于学习)

文章目录 一、简介二、实现代码三、实现效果参考文献一、简介 这是一个很有趣的曲线探测的方法,不过我没有复现出论文中那样的效果,可能是理解有误,但这个算法仍然是很有意思,故这里也对其进行记录。 按照论文中的思路,首先我们需要通过一种线性强度图来计算确定每个点的法…

js事件流模型

js 事件流模型js 事件循环 js 事件流模型 JavaScript的事件流模型可以被概括为三个阶段&#xff1a;捕获阶段&#xff0c;目标阶段和冒泡阶段。这个模型是在DOM&#xff08;文档对象模型&#xff09;中定义的&#xff0c;用于描述事件如何在DOM元素中传播。 捕获阶段&#xf…

C语言实现水仙花

水仙花定义&#xff1a;指一个3位数&#xff0c;其各位数字立方和等于改数本身。若&#xff1a;153 1* 1* 1 5 * 5* 53* 3* 3 依次类推&#xff0c;四 、五 … 十全十美呀。 解题思路 从这句&#xff1a;其各位数字立方和等于改数本身 我们将这位数拆分出来: num num1 ^3 n…

提高图片分辨率的方法与实践

引言 在图像处理和计算机视觉领域&#xff0c;提高图片分辨率是一个常见的问题。随着高分辨率显示设备的普及&#xff0c;如4K、8K电视以及高像素手机摄像头的应用&#xff0c;用户对高质量图片的需求也越来越高。本文将介绍使用Golang语言提高图片分辨率的方法与实践。 1. 图…

服务器如何修改密码

首先先远程登录服务器。 1、右键我的电脑&#xff0c;点击“管理”。 2、在“本地用户和组”中打开“用户”&#xff0c;在右侧找到 Administrator 账户。 3、在 Administrator 账户上点击右键&#xff0c;选择“修改密码”设置您的新密码。 4、修改后请牢记您的系统管理员密…

Java网络编程,使用UDP实现TCP(一), 基本实现三次握手

简介&#xff1a; 首先我们需要知道TCP传输和UDP传输的区别&#xff0c;UDP相当于只管发送不管对方是否接收到了&#xff0c;而TCP相当于打电话&#xff0c;需要进行3次握手&#xff0c;4次挥手&#xff0c;所以我们就需要在应用层上做一些功能添加&#xff0c;如&#xff1a;…

Bounding boxes augmentation for object detection

Different annotations formats Bounding boxes are rectangles that mark objects on an image. There are multiple formats of bounding boxes annotations. Each format uses its specific representation of bouning boxes coordinates 每种格式都使用其特定的边界框坐标…

案例060:基于微信小程序考试系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

01-SDV软件定义汽车思考

前言&#xff1a; 随着汽车产业“新四化”(电动化、网联化、智能化、共享化)的加速推动&#xff0c;智能汽车已成为各国科技发展战略重点&#xff0c;在社会数字化转型的浪潮下逐渐形成跨领域协作、多技术融合的汽车产业新赛道。 软件定义汽车已成为行业趋势与共识&#xff…

gcc安全特性之FORTIFY_SOURCE

GCC 4.0引入了FORTIFY_SOURCE特性&#xff0c;旨在加强程序的安全性&#xff0c;特别是对于字符串和内存操作函数的使用。下面是对FORTIFY_SOURCE机制的深入分析&#xff1a; 1. 功能 FORTIFY_SOURCE旨在检测和防止缓冲区溢出&#xff0c;格式化字符串漏洞以及其他与内存操作…