企业网站的规划与建设/如何查看百度指数
Flink 详解(二):核心篇 Ⅱ
22、刚才提到 State,那你简单说一下什么是 State。
在 Flink 中,状态 被称作 state
,是用来保存中间的计算结果或者缓存数据。根据状态是否需要保存中间结果,分为 无状态计算 和 有状态计算。
- 对于流计算而言,事件持续产生,如果每次计算相互独立,不依赖上下游的事件,则相同输入,可以得到相同输出,是无状态计算。
- 如果计算需要依赖于之前或者后续事件,则被称为有状态计算。
有状态计算如 sum
求和,数据累加等。
23、Flink 状态包括哪些?
(1) 按照由 用户管理 还是 Flink 管理,状态可以分为 原始状态 和 托管状态。
- 原始状态(
Raw State
):由用户自行进行管理。 - 托管状态(
Managed State
):由 Flink 自行进行管理的 State。
两者区别:
- 从 状态管理方式 来说,Managed State 由 Flink Runtime 管理,自动存储,自动恢复,在内存管理上有优化;而 Raw State 需要用户自己管理,需要自己序列化,Flink 不知道 State 中存入的数据是什么结构,只有用户自己知道,需要最终序列化为可存储的数据结构。
- 从 状态数据结构 来说,Managed State 支持已知的数据结构,如
Value
、List
、Map
等。而 Raw State 只支持字节数组,所有状态都要转换为二进制字节数组才可以。 - 从 推荐使用场景 来说,Managed State 大多数情况下均可使用,而 Raw State 是当 Managed State 不够用时,比如需要自定义 Operator 时,才会使用 Raw State。在实际生产过程中,只推荐使用 Managed State。
(2)State 按照 是否有 key 划分为 KeyedState
和 OperatorState
两种。
KeyedState 特点
- 只能用在 KeyedStream 上的算子中,状态跟特定的 key 绑定。
- KeyedStream 流上的每一个 key 对应一个 state 对象。若一个 operator 实例处理多个 key,访问相应的多个 state,可对应多个 state。
- KeyedState 保存在 StateBackend 中。
- 通过 RuntimeContext 访问,实现
Rich Function
接口。 - 支持多种数据结构:ValueState、
ListState
、ReducingState、AggregatingState、MapState。
OperatorState 特点
- 可以用于所有算子,但整个算子只对应一个 state。
- 并发改变时有多种重新分配的方式可选:(1)均匀分配(2)合并后每个得到全量。
- 实现
CheckpointedFunction
或者ListCheckpointed
接口。 - 目前只支持
ListState
数据结构。
这里的 fromElements
会调用 FromElementsFunction
的类,其中就使用了类型为 ListState
的 operator state。
24、Flink 广播状态了解吗?
Flink 中,广播状态叫作 BroadcastState
。 在广播状态模式中使用。所谓广播状态模式, 就是来自一个流的数据需要被广播到所有下游任务,在算子本地存储,在处理另一个流的时候依赖于广播的数据。下面以一个示例来说明广播状态模式。
上图这个示例包含两个流,一个为 Kafka 模型流,该模型是通过机器学习或者深度学习训练得到的模型,将该模型通过广播,发送给下游所有规则算子,规则算子将规则缓存到 Flink 的本地内存中,另一个为 Kafka 数据流,用来接收测试集,该测试集依赖于模型流中的模型,通过模型完成测试集的推理任务。
广播状态必须是 MapState
类型,广播状态模式需要使用 广播函数 进行处理,广播函数提供了处理广播数据流和普通数据流的接口。
25、Flink 状态接口包括哪些?
在 Flink 中使用状态,包含两种状态接口:
- 状态操作接口:使用状态对象本身存储、写入、更新数据。
- 状态访问接口:从
StateBackend
获取状态对象本身。
1、状态操作接口
Flink 中的状态操作接口面向两类用户,即 应用开发者 和 Flink 框架本身。 所以 Flink 设计了两套接口。
(1)面向开发者 State 接口
面向开发的 State 接口只提供了对 State 中数据的增删改基本操作接口,用户无法访问状态的其他运行时所需要的信息。接口体系如下图:
(2)面向内部 State 接口
内部 State 接口是给 Flink 框架使用,提供更多的 State 方法,可以根据需要灵活扩展。除了对 State 中数据的访问之外,还提供内部运行时信息,如 State 中数据的序列化器,命名空间(namespace)、命名空间的序列化器、命名空间合并的接口。内部 State 接口命名方式为 InternalxxxState
。
2、状态访问接口
有了状态之后,开发者自定义 UDF(UserDefineFunction,用户自定义函数)时,应该如何访问状态?
状态会被保存在 StateBackend 中,但 StateBackend 又包含不同的类型。所以 Flink 中抽象了两个状态访问接口:OperatorStateStore
和 KeyedStateStore
,用户在编写 UDF 时,就无须考虑到底是使用哪种 StateBackend 类型接口。
(1)OperatorStateStore 接口原理
OperatorState 数据以 Map 形式保存在内存中,并没有使用 RocksDBStateBackend
和 HeapKeyedStateBackend
。
(2)KeyedStateStore 接口原理
KeyedStateStore 数据使用 RocksDBStateBackend
或者 HeapKeyedStateBackend
来存储,KeyedStateStore 中创建、获取状态都交给了具体的 StateBackend 来处理,KeyedStateStore 本身更像是一个代理。
26、Flink 状态如何存储?
在 Flink 中,状态存储 被叫做 StateBackend,它具备两种能力:
- 在计算过程中提供访问 State 能力,开发者在编写业务逻辑中能够使用 StateBackend 的接口读写数据。
- 能够将 State 持久化到外部存储,提供容错能力。
Flink 状态提供三种存储方式:
- 内存型:
MemoryStateBackend
,适用于验证、测试、不推荐生产使用。 - 文件型:
FSStateBackend
,适用于长周期大规模的数据。 - RocksDB:
RocksDBStateBackend
,适用于长周期大规模的数据。
上面提到的 StateBackend 是 面向用户 的,在 Flink 内部 3 种 State 的关系如下图:
在运行时,MemoryStateBackend
和 FSStateBackend
本地的 State 都保存在 TaskManager 的内存中,所以其底层都依赖于 HeapKeyedStateBackend
。HeapKeyedStateBackend
面向 Flink 引擎内部,使用者无须感知。
1、内存型 StateBackend
MemoryStateBackend
,运行时所需的 State 数据全部保存在 TaskManager JVM 堆上内存中,KV 类型的 State、窗口算子的 State 使用 HashTable 来保存数据、触发器等。执行检查点的时候,会把 State 的快照数据保存到 JobManager 进程的内存中。
MemoryStateBackend
可以使用异步的方式进行快照(也可以同步,推荐异步),避免阻塞算子处理数据。
基于内存的 StateBackend 在生产环境下不建议使用,可以在本地开发调试测试 。注意点如下 :
- State 存储在 JobManager 的内存中,受限于 JobManager 的内存大小。
- 每个 State 默认 5 M B 5MB 5MB,可通过
MemoryStateBackend
构造函数调整。 - 每个 Stale 不能超过 Akka Frame 大小。
2、文件型 StateBackend
FSStateBackend
,运行时所需的 State 数据全部保存在 TaskManager 的内存中, 执行检查点的时候,会把 State 的快照数据保存到配置的文件系统中。
可以是分布式或者本地文件系统,路径如:
- HDFS路径:“hdfs://namenode:40010/flink/checkpoints”
- 本地路径:“file:///data/flink/checkpoints”
FSStateBackend
适用于处理大状态、长窗口、或者大键值状态的有状态处理任务。注意点如下 :
- State 数据首先被存在 TaskManager 的内存中。
- State 大小不能超过 TM 内存。
- TM 异步将 State 数据写入外部存储。
MemoryStateBackend
和 FSStateBackend
都依赖于 HeapKeyedStateBackend
,HeapKeyedStateBackend
使用 State 存储数据。
3、RocksDBStateBackend
RocksDBStateBackend
跟内存型和文件型都不同 。
RocksDBStateBackend
使用嵌入式的本地数据库 RocksDB 将流计算数据状态存储在本地磁盘中,不会受限于 TaskManager 的内存大小,在执行检查点的时候,再将整个 RocksDB 中保存的 State 数据全量或者增量持久化到配置的文件系统中,在 JobManager 内存中会存储少量的检查点元数据。RocksDB 克服了 State 受内存限制的问题,同时又能够持久化到远端文件系统中,比较适合在生产中使用。
缺点:RocksDBStateBackend
相比基于内存的 StateBackend,访问 State 的成本高很多,可能导致数据流的吞吐量剧烈下降,甚至可能降低为原来的 1 / 10 1/10 1/10。
适用场景
- 最适合用于处理大状态、长窗口,或大键值状态的有状态处理任务。
RocksDBStateBackend
非常适合用于高可用方案。RocksDBStateBackend
是目前唯一支持增量检查点的后端。增量检查点非常适用于超大状态的场景。
注意点
- 总 State 大小仅限于磁盘大小,不受内存限制。
RocksDBStateBackend
也需要配置外部文件系统,集中保存 State。- RocksDB 的 JNI API 基于 byte 数组,单 Key 和单 Value 的大小不能超过 8 8 8 字节。
- 对于使用具有合并操作状态的应用程序,如 ListState ,随着时间可能会累积到超过 2 31 2^{31} 231 字节大小,这将会导致在接下来的查询中失败。
27、Flink 状态如何持久化?
首先,Flink 的状态最终都要持久化到第三方存储中,确保集群故障或者作业挂掉后能够恢复。RocksDBStateBackend
持久化策略有两种:
- 全量持久化策略,RocksFullSnapshotStrategy
- 增量持久化策略,RocksIncementalSnapshotStrategy
1、全量持久化策略
每次将全量的 State 写入到状态存储中(HDFS)。内存型、文件型、RocksDB 类型的 StataBackend 都支持全量持久化策略。
在执行持久化策略的时候,使用异步机制,每个算子启动 1 1 1 个独立的线程,将自身的状态写入分布式存储可靠存储中。在做持久化的过程中,状态可能会被持续修改,基于内存的状态后端使用 CopyOnWriteStateTable
来保证线程安全,RocksDBStateBackend
则使用 RocksDB 的快照机制,使用快照来保证线程安全。
2、增量持久化策略
增量持久化就是每次持久化增量的 State,只有 RocksDBStateBackend
支持增量持久化。
Flink 增量式的检查点以 RocksDB 为基础, RocksDB 是一个基于 LSM-Tree 的 KV 存储。新的数据保存在内存中, 称为 memtable
。如果 Key 相同,后到的数据将覆盖之前的数据,一旦 memtable
写满了,RocksDB 就会将数据压缩并写入磁盘。memtable
的数据持久化到磁盘后,就变成了不可变的 sstable
。
因为 sstable
是不可变的,Flink 对比前一个检查点创建和删除的 RocksDB sstable
文件就可以计算出状态有哪些发生改变。
为了确保 sstable
是不可变的,Flink 会在 RocksDB 触发刷新操作,强制将 memtable
刷新到磁盘上。在 Flink 执行检查点时,会将新的 sstable
持久化到 HDFS 中,同时保留引用。这个过程中 Flink 并不会持久化本地所有的 sstable
,因为本地的一部分历史 sstable
在之前的检查点中已经持久化到存储中了,只需增加对 sstable
文件的引用次数就可以。
RocksDB 会在后台合并 sstable
并删除其中重复的数据。然后在 RocksDB 删除原来的 sstable
,替换成新合成的 sstable
。新的 sstable
包含了被删除的 sstable
中的信息,通过合并历史的 sstable
会合并成一个新的 sstable
,并删除这些历史 sstable
。可以减少检查点的历史文件,避免大量小文件的产生。
28、Flink 状态过期后如何清理?
1、DataStream 中状态过期
可以对 DataStream 中的每一个状态设置清理策略 StateTtlConfig,可以设置的内容如下:
- 过期时间:超过多长时间未访问,视为 State 过期,类似于缓存。
- 过期时间更新策略:创建和写时更新、读取和写时更新。
- State 可见性:未清理可用,超时则不可用。
2、Flink SQL 中状态过期
Flink SQL 一般在流 Join、聚合类场景使用 State,如果 State 不定时清理,则导致 State 过多,内存溢出。清理策略配置如下:
StreamQueryConfig qConfig = ...
//设置过期时间为 min = 12小时 ,max = 24小时
qConfig.withIdleStateRetentionTime(Time.hours(12),Time.hours(24));
相关文章:

【大数据】Flink 详解(二):核心篇 Ⅱ
Flink 详解(二):核心篇 Ⅱ 22、刚才提到 State,那你简单说一下什么是 State。 在 Flink 中,状态 被称作 state,是用来保存中间的计算结果或者缓存数据。根据状态是否需要保存中间结果,分为 无状…...

一孩半政策
一) 一孩半,又称独女户二胎,即中国大陆部分农村的一项计划生育政策,第一胎是女孩的夫妻可生育第二个子女。试问这个政策会不会影响男女平衡。 二)如果生女孩一直生,直到生男孩停止,试问会不会…...

如何在 Spring Boot 中集成日志框架 SLF4J、Log4j
文章目录 具体步骤附录 笔者的操作环境: Spring Cloud Alibaba:2022.0.0.0-RC2 Spring Cloud:2022.0.0 Spring Boot:3.0.2 Nacos 2.2.3 Maven 3.8.3 JDK 17.0.7 IntelliJ IDEA 2022.3.1 (Ultimate Edition) 具体步骤 因为 …...

如何在Linux布置nginx(附带Nginx基本操作步骤)
文章目录 前言一、下载环境依赖二、下载nginx安装包三、具体操作流程总结 前言 提示:下述操作步骤适合内网服务器、局域网服务器和公网服务器。 不足之处欢迎交流指正,不喜勿喷。 一、下载环境依赖 yum -y install gcc zlib zlib-devel pcre-devel ope…...

Xcode升级导致关联库报错
想办法找到对应的库 然后到 Build Phases -- LinkBinary With Libraries中点击,选择对应的framework即可,就像我工程的报错 Undefined symbol: _OBJC_CLASS_$_ADClient _OBJC_CLASS_$_ASIdentifierManager 缺失的库是AdSupport.framework 添加后再次编…...

利用docker run --rm 命令实现使用宿主机中没有的命令
利用docker run --rm 命令实现使用宿主机中没有的命令 使用容器中的jar命令解压jar包,并将解压内容输出到挂载在宿主机中的目录里使用宿主机中没有的nmap命令来通过端口找IP 使用容器中的jar命令解压jar包,并将解压内容输出到挂载在宿主机中的目录里 do…...

中级课程——XSS
文章目录 介绍挖掘思路分类反射型存储型dom类型 介绍 挖掘思路 注入点:各种输入框 测试代码(poc):js语句 分类 反射型 存储型 dom类型...

win10+Vmware+ubuntu18 mosquitto调试记录
记录一下在建立mqtt调试环境上遇到的问题及对策。 我的PC环境为,win10为办公环境,Vmware虚拟机安装ubuntu18,虚拟机主要用来进行代码编译,建立mosquitto server测试环境。 1. ubuntu 安装mosquitto 安装mosquitto网上很多教程&…...

Java EE 突击 9 - Spring Boot 日志文件
Spring Boot 日志文件 学习目标一 . 日志有什么用1.1 日志格式说明 二 . 自定义日志打印2.1 得到日志对象2.2 使用日志对象提供的方法 , 输出自定义的日志内容2.3 日志的级别 三 . 日志持久化3.1 在配置文件里面设置日志名称3.2 设置日志的保存目录 四 . 日志级别的设置五 . 简…...

篇十六:命令模式:封装请求
篇十六:"命令模式:封装请求" 开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。 另外有2本不错的关于设计模式的资料&#x…...

Android 系统框架
启动流程 init 进程启动过程 Android系统启动流程 Zygote启动流程及源码分析 APP启动流程 init进程是Android用户空间第一个进程,主要做以下3件事情: 创建和挂载启动所需的文件目录。初始化和启动关键服务,守护关键服务。解析init.rc配…...

【Hystrix技术指南】(3)超时机制的原理和实现
[每日一句] 也许你度过了很糟糕的一天,但这并不代表你会因此度过糟糕的一生。 [背景介绍] 分布式系统的规模和复杂度不断增加,随着而来的是对分布式系统可用性的要求越来越高。在各种高可用设计模式中,【熔断、隔离、降级、限流】是经常被使…...

MySQL: Failed to Connect to MySQL at XXXX:3306 with user root
客户端连接MySQL服务器,报错: 解决方案: 没有让root用户远程登录,需要设置; 进入MySQL服务器,修改一下 # mysql -h localhost -uroot -P3306 -p12345678 mysql: [Warning] Using a password on the comm…...

《大型网站技术架构设计》第二篇 架构-性能
不同视角下的网站性能 1、用户 从用户角度,网站性能就是用户在浏览器上直观感受到的网站响应速度快还是慢。用户感受到的时间。 2、开发人员 开发人员关注的主要是应用程序本身及其相关子系统的性能,包括响应延迟、系统吞吐量、并发处理能力、系统稳定…...

谷歌推出AI模型机器人RT2 将文本和图像输出为机器人动作
去年年底,ChatGPT火遍全球,全世界都见识了大语言模型的强大力量。人们对大模型不再陌生,开始使用基于大模型的应用绘画、作图、搜索资料、设计剧情等,而妙用不止于此。谷歌推出了Robotics Transformer 2(RT2),这是一个…...

常见的服务器安全管理漏洞
常见的服务器安全管理漏洞 企业信息化技术的应用,以不可逆转。随着文件服务器、ERP管理软件等等在企业中生根发芽,应用服务器也逐渐在企业中普及起来。以前在企业中有一台应用服务器已经是了不起的事情,现在有两台、三台的,也不为…...

JavaScript高级:探索作用域链的神秘面纱
在 JavaScript 的编程世界中,作用域是一种控制变量可访问性和生命周期的机制。而作用域链则是闭包的关键所在,它使得函数在创建时捕获并保存了外部作用域的变量,为 JavaScript 增添了更多的魔力。本文将深入探讨作用域链的概念和作用…...

mysql数据库如何转移到oracle
mysql数据库转移到oracle 在研发过程中,可能会用到将表数据库中的表结构及数据迁移到另外一种数据库中, 比如说从mysql中迁移到oracle中, 常用的方法有好些,如下 1、使用powerdesigner,先连接mysql然后生成mysql的p…...

nnU-Net 终极指南
一、说明 了解最先进的nnU-Net以及如何将其应用于您自己的数据集所需的一切。使用nnU-Net,这是语义图像分割中非常强大的基线。在本指南中,您将: 对nnU-Net的主要贡献进行简要概述。了解如何将 nnU-Net 应用于您自己的数据集。 但是ÿ…...

ubuntu 安装 python
ubuntu 安装 python 初环境与设备查询是否安装安装python 本篇文章将介绍ubuntu 安装 python 初 希望能写一些简单的教程和案例分享给需要的人 环境与设备 系统:ubuntu 查询是否安装 因为系统也许会自带一个python,所以验证一下,如果自…...

【腾讯云 Cloud studio 实战训练营】云端 IDE 构建移动端H5
🐱 个人主页:不叫猫先生,公众号:前端舵手 🙋♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步…...

Kubernetes 之 Kubeadm 搭建
Kubeadm 搭建 一、搭建准备1.1 环境准备1.2 所有节点安装docker1.3 所有主机安装 cri-dockerd1.4 所有节点安装kubeadm,kubelet和kubectl1.5 部署K8S集群1.6 设定kubectl1.7 部署 Dashboard 一、搭建准备 master(2C/4G,cpu核心数要求大于2&a…...

Qt应用开发(基础篇)——堆栈窗口 QStackedWidget
一、前言 QStackedWidget继承于QFrame,QFrame继承于QWidget,是Qt常用的堆栈窗口部件。 框架类QFrame介绍 QStackedWidget堆栈窗口,根据下标切换,一次显示一个小部件,常用于应用界面切换、图片轮询播放等场景。 二、QSt…...

浅谈测试开发岗位
一、测试开发的概念与需求 测试开发,通常也被称为自动化测试,是一个涵盖了从测试设计、开发、执行和结果分析等一系列活动的职位。在软件开发的生命周期中,测试开发起着至关重要的作用,其主要目标是确保软件的质量和性能达到预期…...

典型移动APP安全风险提醒
研究背景 随着互联网和移动设备的发展,手机已成为人人都拥有的设备,各式各样的App更是丰富了人们的生活:从社交到出行、从网购到外卖,从办公到娱乐等,App已成为大众生活必需品。然而,App的流行使人们对App…...

多平台发布文章-项目总结
做个最近的AIGC内容创作技术要点的总结吧😼 流程图 时序图...

什么是IoC?什么是Spring IoC?什么是DI?
首先说明 IoC 是一种思想,IoC的全称是Inversion of Control,翻译成中文叫做“控制反转” 用人话来说,IoC的思想就是将一个对象对另一个对象的控制权交出去(不必关心交给谁),从而让对象之间的依赖关系降低&…...

分布式任务调度平台XXL-JOB学习笔记-helloworld运行
环境:win10 eclipse java17 mysql8.0.17 xxl-job 2.4 源码:https://github.com/xuxueli/xxl-job/ 导入时按Existing Maven Projects导入,先导入xxl-job-admin(管理平台)和xxl-job-executor-sample-springboot&#x…...

维护工程师提升设备管理水平的5个技巧
维护在工业工厂中扮演着至关重要的角色,而在这一关键领域,维护工程师发挥着关键作用。无论是混合还是离散自动化产线,设备的正常运行和保养对于确保生产的持续性至关重要。为了实现高效、成功的维护,维护工程师需要采取一系列方法…...

解码大众全新数字高尔夫8汽车CAN FD行驶功能电气架构
据在大众原厂的伙伴介绍,全新数字高尔夫8将在11月上市销售,目前高尔夫8在行驶功能电气架构上采用的CAN FD,在多媒体这一块采用的以太网,后续估计大部分类似同样MQBEvo平台的车型均会复制升级过来,那么,未来…...