Flink 有状态流式处理
传统批次处理方法
【1】持续收取数据(kafka
等),以window
时间作为划分,划分一个一个的批次档案(按照时间或者大小等);
【2】周期性执行批次运算(Spark/Stom
等);
传统批次处理方法存在的问题:
【1】假设计算每小时出现特定事件的转换次数(例如:1、2…),但某个事件正好处于1到2之间就尴尬了。需要将1点处理一半的结果带到2点这个批次中进行运算。而这个划分跟我们事件发生的时间也是有误差的。
【2】在分布式多线程的情况下,如果接收到事件的顺序颠倒了,又该如何处理?
理想方法
累积状态:表示过去历史接收过的所有事件。可以是计数或者机器模型等等。
我们要处理一个持续维护的状态时,最适合的方式就是状态流处理(累积状态和维护状态+时间,是不是该收的结果都收到了)
【1】有状态流处理作为一种新的持续过程范式,处理连续的数据;
【2】产生准确的结果;
【3】实时可用的结果仅为模型的自然结果;
流式处理
流处理系统或者流处理引擎都是数据驱动的,而不是定期或者人为的去触发。数据也没有物理边界。
一般系统都会把操作符放上去,等待数据的到来进行计算。如下是一个逻辑模型(DAG
)
分散式流式处理
【1】从数据中选择一个属性作为key
对输入流进行分区;
【2】使用多个实例,每个实例负责部分key
的存储,根据Hash
值,相同的key
一定落在相同的分区进行处理;
【3】根据流式数据处理的DAG
模型,有对应如下的分布式流处理的实例模型。例如A算子拥有两个实例,上游的实例节点可能同时与下游的一个或多个节点进行传输。这些实例根据系统或者人为的因素分配在不同的节点之上。节点与节点之间数据传输也会涉及网络之间的占用。本地的传输就不需要走网络
有状态分散式流式处理
定义一个变量X
,输出结果依据这个X
,这个X
就是一个状态。有状态分散的流失处理引擎,当状态可能会累计非常大。当key
比较多的时候就会超出单台节点的负荷量。这个x
就应该有状态后台使用memory
去维护它。【数据倾斜】
状态容错(State Fault Tolerance)
状态挂了,如何确保状态拥有精确一次(exactly-onceguarantee
)的容错保证?就是通过定期的快照+事件日志位置。我们先假设一个简单的场景,如下,一个队列在不断的传输数据。单一的process
在处理数据。这个process
没处理一个数据都会累计一个状态。如何为这个process
做一个容错。做法就是没处理完一笔,更改完状态之后,就做一次快照(包含它处理的数据在队列中的位置和它处理到的位置以及当时的状态进行对比)
举个例子:如下我处理到第二笔数据,我就会记录下第二个位置在进入process
之前的信息(位置X
+状态@X
)
当进入process
处理的时候出现了fail
时,Flink
就会根据上一次的位置+状态进行恢复。
如何在分散式场景下替多个拥有本地状态的运算子产生一个全域一致的快照(global consistent snapshot
)?
方式一:更改该任务流过的所有运算子的状态。比较笨,有一个副作用,就是我处理完这笔数据,它应该就到了一个process
,我本应该做其他数据的处理了,可是为了全局一致性快照就会停止前面和当前的process
的运算来保证全局一致性。
分散式状态容错
通过checkpoint
实现分散式状态容错
每一个运算子它本地都有一个维护一个状态,当要产生一个检查点(checkpoit
)的时候,都会将这个检查点存储在一个更小的分布式文件系统DFS
中。当出现某个算子fail
之后,就会从所有的checkpoint
中获取所有算子的上一个状态进行恢复。把消息队列的位置也进行恢复。也就是多线程工作,每一个任务在DFS
中就可以看作一个线程,它们数据存储的key
就是这个任务,每一个算子的处理状态都会按照处理顺序添加进去。
分布式快照(Distributed Snapshots)
更重要是时如何在不中断运算的前提下生成快照?其实就是给每一个任务标记一个checkpoint n
不同的任务这个n
是不同的,相同的任务在不同的算子里面它是相同的。具体我们把这个分解后看看。
【1】如下图,当我们从数据源获取数据的时候,其实我们已经开始有状态了,这个时候我们可以把任务处理的整个过程抽象成如下图中的一张表。
【2】首先是数据源的状态,就是数据在操作前的一个位置offset
进行快照存储,如下图所示:
【3】当获取到数据源之后,就进入算子中进行处理,此时就会对数据进入之前的状态进行checkpoint
。记录一个savepoint
。
【4】在最后一次操作前(输出)也会记录checkpoint
。在这个过程中,其实前面的算子也在产生不同的 checkpoint n-1
等。如果要进行恢复使用的话,必须是一个complete
完整的Checkpoint
。只有部分数据的Checkpoint是不能使用的。
状态维护(State Management)
本地维护的这个状态可能非常非常大。后端的管理系统一般使用内存维护这些状态。
Flink
提供了两种状态后端:JVM Heap
状态后端,适合比较小的状态,量不要很大。当运算子action
要读取状态的时候,都是一个Java
对象的read
或者write
。当要产生一个检查点的时候,需要将每个运算子的本地状态数据通过序列化存储在DFS
中,
当状态非常大的时候就不能使用JVM Heap
的时候,就需要用到RocksDB
。当算子需要读取的时候本地state
的时候需要进行序列化操作从而节省内存,同时,当需要进行checkpoint
到DFS
时,也少了序列化的步骤。它也会给本地存储一份,当fail
的时候就可以很快恢复,提高效率。
Event-time 处理
EventTime
是事件产生的时间。
下面是一张,程序处理时间与事件发生时间的时间差的一张对比图来更好的理解EventTime
。
Event-Time 处理
也就是说我们要统计的3-4
点之间的数据,程序4点结束这个执行不是根据window
时间,而是根据event-Time
。
Watermarks
Flink
是watermarks
实现Event-Time
功能的。在Flink
里面也属于一个特殊事件,精髓是当某个运算子收到一个带有时间戳t
的watermark
后就不会再收到任何小于该时间戳的事件了。也就是当window
需要统计4
点的数据时,例如我们每5
分钟发一次watermark
,那么当window
收到4.05
的watermark
的时候才会去统计4
点之前的数据(下一次)。如果4.05
收到了4
点之前的数据的话,Flink1.5
会把这个事件输出到旁路输出(side output
),你可以获取出来,进行处理。目前有一个问题就是:如果某个Stream Partition 没有输入了,也就没有Watermarks
。那么window
就没办法进行处理了。当多个数据流的watermarks
不相同的时候,Flink
会取最小的watermarks
进行运算。可以在接收到资源的时候通过代码设置watermarks
。
OutputTag<String> outputTag = new OutputTag<String>("side-output") {};
状态保存与迁移(Savenpoints and Job Migration)
可以想成:一个手动产生的检查点(CheckPoint
):保存点记录某一个流失应用中的所有运算中的状态。当触发SavePoint
之后,Flink
提供了两种选择停止消费或者继续运算,根据场景定义。
执行停止之前,产生一个保存点。就可以解决上面提到的3个问题。
从保存点恢复新的执行,这个时候,例如我们重启花了30
分钟,这段事件kafka
还在不断的接收新的数据。恢复之后,Flink
就需要从当时记录的kafka
位置赶上最新的位置。这个时候利用Event-Time
处理新的数据都是事件发生时的数据,这个时候再跟程序执行的时间比较就更能体现Event-time
的价值。
相关文章:

Flink 有状态流式处理
传统批次处理方法 【1】持续收取数据(kafka等),以window时间作为划分,划分一个一个的批次档案(按照时间或者大小等); 【2】周期性执行批次运算(Spark/Stom等);…...
LeetCode //C - 1071. Greatest Common Divisor of Strings
1071. Greatest Common Divisor of Strings For two strings s and t, we say “t divides s” if and only if s t … t (i.e., t is concatenated with itself one or more times). Given two strings str1 and str2, return the largest string x such that x divides …...

智能优化算法应用:基于群居蜘蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于群居蜘蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于群居蜘蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.群居蜘蛛算法4.实验参数设定5.算法结果6.…...
AtCoder Beginner Contest 332
E - Lucky bag(简单状态压缩dp) 题目链接 题意:给你n个物品,m个福袋,让你将这n个物品用m个福袋打包(福袋可以为空),让分完之后的总方差最小,输出最小方差。 思路:其实由题目的数据…...

华为OD试题二(文件目录大小、相对开音节、找最小数)
1. 文件目录大小 题目描述: 一个文件目录的数据格式为:目录id,本目录中文件大小,(子目录id 列表)。其中目录id全局唯一,取值范围[1,200],本目录中文件大小范 围[1,1000],子目录id列表个数[0,10…...

【Spark精讲】Spark作业执行原理
基本流程 用户编写的Spark应用程序最开始都要初始化SparkContext。 用户编写的应用程序中,每执行一个action操作,就会触发一个job的执行,一个应用程序中可能会生成多个job执行。一个job如果存在宽依赖,会将shuffle前后划分成两个…...

Docker容器:Centos7搭建Docker镜像私服harbor
目录 1、安装docker 1.1、前置条件 1.2、查看当前操作系统的内核版本 1.3、卸载旧版本(可选) 1.4、安装需要的软件包 1.5、设置yum安装源 1.6、查看docker可用版本 1.7、安装docker 1.8、开启docker服务 1.9、安装阿里云镜像加速器 1.10、设置docker开机自启 2、安…...
ClickHouse安装和部署
ClickHouse安装过程: ClickHouse支持运行在主流64位CPU架构(X86、AArch和PowerPC)的Linux操作 系统之上,可以通过源码编译、预编译压缩包、Docker镜像和RPM等多种方法进行安装。由于篇幅有限,本节着重讲解离线RPM的安…...
Spring Cloud Gateway中对admin端点进行认证
前言 我们被扫了一个漏洞,SpringBoot Actuator 未授权访问,漏洞描述是这样的: Actuator 是 springboot 提供的用来对应用系统进行自省和监控的功能模块,借助于 Actuator 开发者可以很方便地对应用系统某些监控指标进行查看、统计…...

2. 如何通过公网IP端口映射访问到设备的vmware虚拟机的ubuntu服务器
文章目录 1. 主机设备是Windows 11系统2. 安装vmware虚拟机3. 创建ubuntu虚拟机(据说CentOS 7 明年就不维护了,就不用这个版本的linux了)4. 安装nginx服务:默认端口805. 安装ssh服务:默认端口226. 设置主机 -> ubuntu的端口映射7. 设置路由…...

配置android sudio出现的错误
导入demo工程,配置过程参考: AndroidStudio导入项目的正确方式,修改gradle配置 错误:Namespace not specified. Specify a namespace in the module’s build file. 并定位在下图位置: 原因:Android 大括号…...

【初阶C++】前言
C前言 1. 什么是C2. C发展史3. C的重要性4. 如何学习C 1. 什么是C C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, …...

MAC IDEA Maven Springboot
在mac中,使用idea进行maven项目构建 环境配置如何运行maven项目1.直接在IDEA中运行2.使用jar打包后执行 如何搭建spring boot1.添加依赖2.创建入口类3.创建控制器4. 运行5.其他 环境配置 官网安装IDEA使用IDEA的创建新项目选择创建MAEVEN项目测试IDEA的MAVEN路径是…...
Angular13无法在浏览器debug
前言 本文将介绍如何解决在Angular 13中无法在浏览器中进行调试的问题,并提供了一种解决方法。 发生场景 根据项目需求,升级至Angular 13后,发现无法在浏览器中进行调试。 问题原因 无法进行调试的原因是,当使用Angular 13的…...
H.264与H.265(HEVC):视频编码的演进
目录 H.264的发展历程 1. 标准发布 2. 广泛应用 3. 专业化应用 H.265的出现...

Python从入门到精通九:Python异常、模块与包
了解异常 什么是异常 当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的“异常”, 也就是我们常说的BUG bug单词的诞生 早期计算机采用大量继电器工作,马克二型计算机就是这样的。 19…...

无需公网IP联机Minecraft,我的世界服务器本地搭建教程
目录 前言 1.Mcsmanager安装 2.创建Minecraft服务器 3.本地测试联机 4. 内网穿透 4.1 安装cpolar内网穿透 4.2 创建隧道映射内网端口 5.远程联机测试 6. 配置固定远程联机端口地址 6.1 保留一个固定TCP地址 6.2 配置固定TCP地址 7. 使用固定公网地址远程联机 8.总…...

机器学习-SVM(支持向量机)
推荐课程:【机器学习实战】第5期 支持向量机 |数据分析|机器学习|算法|菊安酱_哔哩哔哩_bilibili 赞美菊神ヾ ( ゜ⅴ゜)ノ 一、什么是支持向量机? 支持向量机(Support Vector Machine, SVM)是一类按监督学习࿰…...
保姆级:Windows Server 2012上安装.NET Framework 3.5
📚📚 🏅我是默,一个在CSDN分享笔记的博主。📚📚 🌟在这里,我要推荐给大家我的专栏《Windows》。🎯🎯 🚀无论你是编程小白,还是有…...

昇腾910安装驱动出错,降低Centos7.6的内核版本
零、问题描述: 在安装Atlas800-9000服务器的驱动的时候,可能会出现错误:Dkms install failed, details in : /var/log/ascend_seclog/ascend_install.log 如下所示: [rootlocalhost ~]# ./Ascend-hdk-910-npu-driver_23.0.rc3_l…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...