【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关闭事务,提交的数据可以正常消费了

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

P30 C++智能指针

前言 🎬 个人主页:ChenPi 🐻推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ 🔥 推荐专栏2: 《Linux C应用编程(概念类)_ChenPi的博客-CSDN博客》✨✨✨ 🛸推荐专栏3: ​​​​​​《 链表_Chen…

在Spring Cloud使用Hystrix核心组件,并注册到Eureka注册中心去

其实吧,写Spring Cloud系列,我有时候觉得也挺难受的,因为Spring Cloud的微服务启动都需要一个一个来,并且在IDea中也需要占用比较大的内存,并且我本来可以一篇写完5大核心组件的,但是我却分了三篇&#xff…

QT 重定向qdebug输出到自绘界面

因为在嵌入式中调试qt需要查看输出信息,特意写了一个类用户便捷查看qdebug信息 界面如下: 提供了开始,停止,保存,清空,退出功能,具体代码下文给出 文件如下 #ifndef QDEBUGREDIRECT_H #define QDEBUGREDIRECT_H /**qdebug 重定向类 定向到界面控件*李吉磊 2023.12.7* */#in…

【dig命令查询方法】

dig(Domain Information Groper)是一个用于查询DNS(域名系统)的命令行工具,它可以帮助您获取关于域名的各种信息,如IP地址、MX记录、NS记录等。下面是dig的详细使用教程。 基本语法: dig [ser…

【数据库】树形数据组织架构下的封锁并发控制,B树索引并发访问控制,树协议原理及案例分析

数据库并发访问树协议 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会…

docker基本管理和概念

1、定义:一个开源的应用容器引擎,基于go语言开发,运行在liunx系统中的开源的、轻量级的“虚拟机” docker的容器技术可以在一台主机上轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器 docker的宿主机是liunx系统,集…

深度学习与逻辑回归模型的融合--TensorFlow多元分类的高级应用

手写数字识别 文章目录 手写数字识别1、线性回归VS逻辑回归Sigmoid函数 2、逻辑回归的基本模型-神经网络模型3、多元分类基本模型4、TensorFlow实战解决手写数字识别问题准备数据集数据集划分 特征数据归一化归一化方法归一化场景 标签数据独热编码One-Hot编码构建模型损失函数…

NLP自然语言处理学习笔记

参考:NLP(自然语言处理)介绍 - 知乎 (zhihu.com) 一、NLP是什么 自然语言处理( Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自…

uni-app 微信小程序之好看的ui登录页面(一)

文章目录 1. 页面效果2. 页面样式代码 更多登录ui页面 uni-app 微信小程序之好看的ui登录页面(一) uni-app 微信小程序之好看的ui登录页面(二) uni-app 微信小程序之好看的ui登录页面(三) uni-app 微信小程…

原生微信小程序将字符串生成二维码图片

weapp-qrcode.js再最后 inde.ts中的内容 // pages/qrCode/index.ts // 引入weapp-qrcode.js文件 var QRCode require(../../utils/weapp-qrcode) Page({/*** 页面的初始数据*/data: {orderNo:"",imagePath:},/*** 生命周期函数--监听页面加载*/onLoad(options:any)…

渗透测试(Lab1.0)

1、用搜索引擎Google或百度搜索麻省理工学院网站中文件名包含“network security”的pdf文档,截图搜索得到的页面。 2、照片中的女生在哪里旅行? 截图搜索到的地址信息。 搜索餐厅的名字,找一下关键词 3、手机位置定位 通过LAC&#xff0…

【AIGC】prompt工程从入门到精通--图片生成专题

本文为系列教程【AIGC】prompt工程从入门到精通的子教程。 一、介绍 与文本提示相比,找到最佳的提示词来生成完美的图片并没有那么成熟。这可能是因为创建对象自身的挑战,这些对象基本上是主观的并且往往缺乏良好的准确性度量方法。 本指南涵盖了基本…

前端典例算法集合

前言 刷算法顺序:1、熟悉本文章第1点的内容;2、刷力扣算法,可以参考这本书的顺序与思想:代码随想录完整版PDF下载 | 合集下载 | 百度云 | | 代码随想录 (programmercarl.com) 3、刷牛客的高频考题 1、熟悉数组Array&#xff0c…

uni-app 微信小程序之好看的ui登录页面(四)

文章目录 1. 页面效果2. 页面样式代码 更多登录ui页面 uni-app 微信小程序之好看的ui登录页面(一) uni-app 微信小程序之好看的ui登录页面(二) uni-app 微信小程序之好看的ui登录页面(三) uni-app 微信小程…

uni-app 微信小程序之好看的ui登录页面(二)

文章目录 1. 页面效果2. 页面样式代码 更多登录ui页面 uni-app 微信小程序之好看的ui登录页面(一) uni-app 微信小程序之好看的ui登录页面(二) uni-app 微信小程序之好看的ui登录页面(三) uni-app 微信小程…

2023五岳杯量子计算挑战赛数学建模思路+代码+模型+论文

目录 计算力网络(CPN)是一种新型的信息基础设施,完整论文代码见文末 问题描述 2.1 问题1 2.2 问题2 2.3 问题3 问题1的解答过程: 问题3的解答过程: 决策优化应用场景:人工智能模型超参数调优 背景信…

【开源】基于Vue和SpringBoot的车险自助理赔系统

项目编号: S 018 ,文末获取源码。 \color{red}{项目编号:S018,文末获取源码。} 项目编号:S018,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 车…

MQTT源码分析

目录 MQTT源码分析 1. MQTT客户端功能 2. 客户端软件如何实现 3. 程序分层 4. 情景分析 4.1 连接服务器 4.2 创建线程 4.3 发布消息 4.4 最复杂:订阅消息 MQTT源码分析 分析源码:mqttclient\test\emqx\test.c 参考资料: kawaii-mqt…

【开源】基于Vue.js的二手车交易系统

文末获取源码,项目编号: S 084 。 \color{red}{文末获取源码,项目编号:S084。} 文末获取源码,项目编号:S084。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 二手车档案管理模块…

RabbitMQ 常见面试题

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