【Flink系列五】Checkpoint及Barrier原理

本章内容

  • 一致性检查点
  • 从检查点恢复状态
  • 检查点实现算法-barrier
  • 保存点Savepoint
  • 状态后端(state backend)

本文先设置一个前提,流处理的数据都是可回放的(可以理解成消费的kafka的数据)

一致性检查点(checkpoints)

图1

  • checkpoint是Flink故障恢复的核心,全称是应用状态的一致性检查点
  • 有状态流应用的一致性检查点,其实就是所有任务处理完数据的状态,在某个时间点的一份拷贝(一份快照,存储在状态后端),这个时间点,应用是所有任务能恰好处理完一个相同的输入数据的时候

(图1中不考虑时间,假设1、2、3、4、5、6、7为source源,even为偶数6=2+4,odd为奇数求和9=1+3+5,此时5这个数据在所有tasks都处理完成了,每个任务都会提交一份快照给JM,最终这份拓扑结构(source任务状态是5、sum_even状态是6、sum_odd状态是9)称为checkpoint)

从检查点恢复状态

图2

  • 在执行流应用期间,Flink会定期保存状态的一致性检查点
  • 如果发生故障,Flink会使用最近的检查点来一致恢复应用程序的状态,并重新启动处理流程

(假设处理到7这个数据的时候,sum_even=2+4+6=12,sum_odd在处理7这个数据的时候fail了,应该如果恢复数据呢)

第一步:遇到故障之后,重启受影响的应用,应用重启的之后,所有任务的状态都是空的

图3

第二步:从checkpoint中读取状态,将状态重置,从检查点重新启动应用程序后,其内部状态与检查点完成时的状态完全相同(回到了和图1相同的状态,如果算子设置了并行度,也可以恢复)。恢复后,source任务必须从检查点恢复的结果后开始读取数据(必须从6开始读取数据)

图4

第三步:开始消费并处理检查点到发生故障之间的所有数据。(处理完7后,sum_even=2+4+6=12,sum_odd=1+3+5+7=16, 所有tasks都处理完后,又会提交一个checkpoint)

图5

这种检查点的保存和恢复机制可以为应用程序状态提供“精确一次”(exactly-once)的一致性,因为所有的算子都会保存检查点并恢复其所有状态,这样依一来所有的输入流就都会被重置到检查点完成时的位置。

检查点的实现算法

基于Chandy-Lamport算法的分布式快照,将检查点的保存和数据处理分离开,不暂停整个应用

思考一个问题:flink如何判断某个数据已经处理完了呢?(比如图1的offset=5的数据)

答案:是否在每个数据后面跟一个标记,当读到这个标记的时候触发task状态的保存

检查点分界线(checkpoint barrier)
  • Flink的检查点算法用到了一种称为分界线(barrier)的特殊数据形式,用来把一条流上数据按照不同的检查点分开
  • 分界线之前到来的数据导致的状态更改,都会包含在当前分界线所属的检查点中;二基于分界线之后的数据导致的所有更改,就会包含在之后的检查点中

图6

barrier有很多叫法,如检查点屏障等

分析一下barrier的工作流程,假设现在有这样的一个场景:有两个输入流的应用程序,用并行的两个source任务来读取(可以认为kafka的两个分区,source并行度设置为2),如图7所示。barrier也是和watermark一样,都是通过广播的方式传递给下游算子

图7

(source任务的并行度=2,sum任务的并行度也是2,sink任务的并行度也是2。)

如图7,两个流的数据都是1、2、3、4、5、6;蓝色数字圆圈代表最后一个处理的是蓝流里面的数据,黄色数字圆圈代表最后一个处理的是黄流里面的数据。

图8

图8中两条流的情况下,barrier如何传递呢?(watermark是取上游分区的最小值)下面一起来看一下

图9

barrier是怎么产生的?

答:JobManager会向每个source任务(同时发给并行的source任务)发送一条带有检查点ID的消息(蓝色三角形2),通过这种方式来启动检查点。产生barrier的过程中,不会影响下游task的正常工作(图9相比图8黄2和蓝2都sink完成了)图9中barrier(ID=2)插入在stream1的3后面,stream2的4后面

图10

barrier随着数据流动,广播到下游,source任务处理完barrier(ID=2)后,会向状态后端发送checkpoint,记录此时的状态。图10相比图9蓝3和黄4都被sum任务处理了。

  • 数据源将他们的状态写入检查点,并发出一个检查点barrier
  • 状态后端在状态存入检查点之后,会返回通知给source任务,source任务就会向JobManager确认检查点完成

sum_even收到上游所有的barrier之后,才能去做checkpoint状态保存,这就叫做Barrier对齐(分分界线对齐)

图11

  • 分界线对齐:barrier向下游传递,sum任务会等待所有的输入分区的barrier到达
  • 对于barrier已经到达的分区,继续到达的数据会被缓存
  • 而barrier尚未到达的分区,数据会被正常处理

图11中的sum_even中的蓝4需要被缓存,因为来自上游任务的黄色barrier(ID=2)还未到达。(stream1有可能在同一个slot,stream2和stream1跨slot,可能barrier到达的时间会不一致)

图12

  • 当收到所有分区的barrier时,任务就讲其状态保存到状态后端的检查点中,然后barrier继续向下游广播

图12中,barrier(ID=2)继续向下游广播。此时蓝色4会从缓存中拿出来做接下来的计算

图13

图13中,sum_even处理完4+8=12,以及4+6+8=18,任务开始正常的数据处理

图14

  • sink任务向JobManager确认状态保存到checkpoint完毕
  • 当所有的任务都确认已经成功将状态保存到检查点时,检查点就真正完成了(3-4-8-8拓扑保存完成)

最终JobManager会向所有的任务确认task的状态是否正确,确认完成后任务完成。

保存点

  • Flink还提供了自定义的镜像保存功能,就是保存点(savepoints)
  • 原则上,创建保存点使用的算法与检查点的完全相同,因此保存点可以认为就是具有一些额外元数据的检查点
  • Flink不会自动创建保存点,因此用户(或者外部调度系统)必须明确的触发创建操作
  • 保存点是一个强大的功能。除了故障恢复外,保存点可以用于:有计划的手动备份,更新应用程序,版本迁移,暂停和重启应用,等等

状态后端

Flink 提供了三种可用的状态后端用于在不同情况下进行状态的保存

  • MemoryStateBackend

内存级的状态后端,将监控状态作为内存中的对象进行管理,将他们存储在TM的JVM堆上,而将checkpoint存储在JM的内存中

  • FsStateBackend

将checkpoint存储到远程的持久化系统FileSystem中,而对于本地状态,和MemotyStateBackend一样,也会存储在TM的JVM堆上

  • RocksDBStateBackend

将所有的状态序列化后,存入本地的RocksDB中(注意:RocksDb的支持并不直接包含在Flink中,需要引入依赖),RocksDBStateBackend 是唯一支持增量快照的状态后端。

后续补充具体的代码

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

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

相关文章

深度学习之注意力机制

注意力机制与外部记忆 注意力机制与记忆增强网络是相辅相成的,神经网络去从内存中或者外部记忆中选出与当前输入相关的内容时需要注意力机制,而在注意力机制的很多应用场景中,我们的外部信息也可以看作是一个外部的记忆 这是一个阅读理解任务…

Nodejs安装使用,nvm对Nodejs和npm版本控制

Nodejs 安装 使用: npm 是Nodejs的内置 包管理工具 下载长期支持版本Node.js 中文网Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是全…

Flink之JDBCSink连接MySQL

输出到MySQL 添加依赖 <dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-jdbc</artifactId><version>3.1.0-1.17</version> </dependency> <dependency><groupId>com.mysql</gr…

在pytorch中自定义dataset读取数据

这篇是我对哔哩哔哩up主 霹雳吧啦Wz 的视频的文字版学习笔记 感谢他对知识的分享 有关我们数据读取预训练 以及如何将它打包成一个一个batch输入我们的网络的 首先我们来看一下之前我们在讲resnet网络时所使用的源码 我们去使用了官方实现的image folder去读取我们的图像数据 然…

xilinx的XVC协议

文章目录 概述JTAG工作方式XVC协议 其他Debug Bridge IP 概述 JTAG工作方式 XVC协议 其他 Debug Bridge IP

Python正则表达式指南

正则表达式指南 摘要 本文是关于在 Python 中通过 re 模块使用正则表达式的入门教程。它提供了比“标准库参考”的相关章节更平易的介绍。 引言 正则表达式&#xff08;Regular expressions&#xff0c;也叫 REs、 regexs 或 regex patterns&#xff09;&#xff0c;本质上…

设计模式基础——概述(1/2)

目录 一、设计模式的定义 二、设计模式的三大类别 三、设计模式的原则 四、主要设计模式目录 4.1 创建型模式&#xff08;Creational Patterns&#xff09; 4.2 结构型模式&#xff08;Structural Patterns&#xff09; 4.3 行为型模式&#xff08;Behavioral Patterns&…

Vue脚手架 生命周期 组件化开发

Vue脚手架 & 生命周期 & 组件化开发 一、今日目标 1.生命周期 生命周期介绍生命周期的四个阶段生命周期钩子声明周期案例 2.综合案例-小黑记账清单 列表渲染添加/删除饼图渲染 3.工程化开发入门 工程化开发和脚手架项目运行流程组件化组件注册 4.综合案例-小兔…

yolov8 pose coco2yolo

import os import json from tqdm import tqdm import argparseparser argparse.ArgumentParser() # 这里根据自己的json文件位置&#xff0c;换成自己的就行 parser.add_argument(--json_path,defaultrC:\Users\k167\Desktop\dataset\person_dataset/instances_val2017_perso…

Echarts运用之柱状图常见问题及案例代码

前言 ECharts 是一个开源的 JavaScript 可视化库,用于生成各种类型的图形和图表。其中,柱状图(Bar chart)是一种常见的图表类型,用于表示不同类别之间的数值比较。 初学者,可参考下我的另外一篇文章,从基础到深入,解读柱状图的运用。 Echarts之柱状图 常见问题及案例…

MQTT协议对比TCP网络性能测试模拟弱网测试

MQTT正常外网压测数据---时延diff/ms如下图&#xff1a; MQTT弱网外网压测数据 TCP正常外网压测数据 TCP弱网外网压测数据 结论&#xff1a; 在弱网场景下&#xff0c;MQTT和TCP的网络性能表现会有所不同。下面是它们在弱网环境中的对比&#xff1a; 连接建立&#xff1a;M…

python文件读写

文章目录 读文件python2&python3差异示例代码 文件路径问题处理&#xff1a;字符编码报错 读文件 python2&python3差异 普通模式&#xff08;python2、python3通用&#xff09; f open(fileName, moder)open函数在python2和python3差异点&#xff1a; python3支持…

【代码随想录刷题】Day20 二叉树06

文章目录 1.【654】最大二叉树1.1 题目描述1.2 解题思路1.3 java代码实现1.4 总结 2.【617】合并二叉树2.1 题目描述2.2 解题思路2.3 java代码实现 3.【700】二叉搜索树中的搜索3.1 题目描述3.2 解题思路3.3 java代码实现 4.【98】验证二叉搜索树4.1 题目描述4.2 解题思路4.3 j…

盘点11月Sui生态发展,了解Sui的近期成长历程!

11月是Web3的“回暖期”&#xff0c;行业持续展现增长趋势。Sui紧随行业脚步&#xff0c;开展了一系列生态活动。其中历时一个多月的Quest 3游戏活动顺利结束并公布奖励&#xff0c;在多地区成功举办Move和Sui生态黑客松&交流会&#xff0c;还有针对中文社区开发者教育的星…

MQTT协议对比QUIC网络性能测试模拟弱网测试

MQTT正常外网压测数据---时延diff/ms如下图&#xff1a; MQTT弱网外网压测数据 QUIC正常外网压测数据 QUIC弱网外网压测数据 结论&#xff1a; 在弱网情况下&#xff0c;MQTT和QUIC&#xff08;Quick UDP Internet Connections&#xff09;这两种协议的网络性能表现也会有…

Axure原型图表组件库,数据可视化元件(Axure9大屏组件)

针对Axure制作的大屏图表元件库&#xff0c;帮助产品经理更高效地制作高保真图表原型&#xff0c;是产品经理必备元件工具。现分享完整的组件库&#xff0c;大家一起学习。 本组件库的图表模块&#xff0c;已包含所有常用的图表&#xff0c;以下为部分组件截图示意。文末可下载…

页面初始化后,需要滚动到某个元素的位置,但是该元素尚未渲染完成。

vue方式 <template><div class"doc"><!-- 判断是否还在渲染期间 --><div class"fixed" v-show"loading">页面仍在渲染中&#xff0c;请稍后</div><div class"green" v-show"!loading">…

TA-Lib学习研究笔记(九)——Pattern Recognition (2)

TA-Lib学习研究笔记&#xff08;九&#xff09;——Pattern Recognition &#xff08;2&#xff09; 形态识别的函数的应用&#xff0c;通过使用A股实际的数据&#xff0c;验证形态识别函数&#xff0c;用K线显示出现标志的形态走势&#xff0c;由于入口参数基本上是open, hig…

反向传播算法

反向传播算法的数学解释 反向传播算法是深度学习中用于训练神经网络的核心算法。它通过计算损失函数相对于网络权重的梯度来更新权重&#xff0c;从而最小化损失。 反向传播的基本原理 反向传播算法基于链式法则&#xff0c;它按层反向传递误差&#xff0c;从输出层开始&…

寒冬不再寒冷:气膜体育馆如何打造温馨运动天地

取暖季即将来临&#xff0c;随着气温逐渐下降&#xff0c;人们在寒冷的冬季里如何保持运动热情和身体的健康成为了一项挑战。而在这个时候&#xff0c;气膜体育馆成为了运动爱好者们的理想场所&#xff0c;提供如春般温暖舒适的运动环境。那么&#xff0c;让我们一起揭秘气膜体…