Flink状态编程
Flink处理机制的核心就是“有状态的流处理”,在某些情况下,一条数据的计算不仅要基于当前数据自身,还需要依赖数据流中的一些其他数据。这些在一个任务中,用来辅助计算的数据我们就称之为这个任务的状态。
一、按键分区状态(KeyedState)分类
按键分区状态是根据输入流中定义的key来进行维护和访问的,所有是定义在KeyedStream中的,也就是对datastream进行keyby之后才能使用按键分区状态。
按键分区状态支持的结构类型主要有以下几种:
(1)ValueState(值状态)
顾名思义 ,就是状态只保存一个值,这个值的类型可以是任何具体的数据类型。如ValueState<Long>。
publice interface ValueState<T> extends State {T value(); // 获取当前状态的值void update(T value); // 对状态进行更新
}
(2)ListState(列表状态)
以列表的形式保存数据。
publice interface ListState<T> extends State {Iterable<T> get(); // 获取当前的列表状态 是一个可迭代对象void update(List<T> values); // 传入一个列表,对列表状态进行覆盖更新void add(T value); // 在状态列表中添加一个元素void addAll(List<T> values); //添加多个元素
}
(3)MapState(映射状态)
把键值对作为状态保存起来。
publice interface MapState<K, V> extends State {V get(K key); // 获取传入key对应的value值void put(K key, V value); //更新key对应的valuevoid putAll(Map<K, V> map);void remove(K key); boolean contains(K key);Iterable<Map.Enter<K, V>> entries();Iterable<K> keys();Iterable<V> values();boolean isEmpty();
}
(4)ReducingState(归约状态)
归约状态保存的是进行归约计算后的结果值,也就是每add一个元素,都进行归约计算,并将归约结果保存为当前状态值,因此需要在归约状态描述器中声明一个归约函数。
(5)AggregatingState(聚合状态)
聚合状态与归约状态类似,聚合状态也是一个值,只不过聚合状态描述器传入的是一个更加一般化的聚合函数,可以重新定义中间状态和输出状态的类型。
二、状态生存时间(TTL,time-to-live)
在实际应用中,状态会随着时间的推移而逐渐增多,如果不加以限制,最终就会导致存储空间的耗尽。Flink可以为状态配置“生存时间”,当状态在内存中存活的时间超过设定的值时,就将他清除掉,调用clear方法可以清除状态。
但是,如果额外开启一个进程不断扫描所有的状态是否过期会占用大量资源且很多情况下是无用功,一个比较好的方法是:状态失效的时候不立即删除,之后如果有对这个状态进行访问,再判断是否已经失效、从而进行清除,则不需要另外开启进程进行扫描了。
配置状态的TTL时,首先需要创建一个StateTtlConfig配置对象,然后调用(状态描述器.enableTimeToLive())方法启动TTL功能。
StateTtlConfig ttlConfig = StateTtlConfig.newBuilder(Time.seconds(10)).setUpdateType(StateTtlConfig.UpdateType.OnCreateAndWrite)//创建状态和更新状态时才更新失效时间.setStateVisibility(StateTtlConfig.StateVisibility.NeverReturnExpired)//不返回过期值.build();ValueStateDescriptor<String> stateDescriptor = new ValueStateDescriptor<>('my_state', String.class);stateDescriptor.enableTimeToLive(ttlConfig)
三、算子状态分类
算子状态针对当前算子任务有效,不对key进行隔离,与key无关,因此一个并行子任务上的不同key会访问到相同的算子状态。
(1)ListState(列表状态)
与上面类似。差别主要在于重分区时,按键分区状态的ListState是以keyGrouo的形式重新均衡发送到下游的,而算子状态的ListState是将所有数据收集到一起均匀分配。
(2)UnionListState(联合列表状态)
与ListState类似。差别主要在于重分区时,是将所有的状态一起发送到下游的每一个并行子任务上,列表状态太大时效率很低,不建议使用。
(3)BroadcastState(广播状态)
对所有的并行子任务保持同一份“全局”状态,一般用来做统一的规则或配置设定。这时所有的并行子任务都将访问同一个状态,就像是状态被广播了,注意没有真正广播。
广播状态必须基于广播流来创建。
(4)算子状态的持久化保存
与按键分区状态相比,算子状态的故障后重新恢复稍显复杂:因为故障重启后可能发生并行度调整,按键分区状态中相同的key仍然可以被分配到一个子任务上,然而算子状态下的数据所发往的分区可能会发生变化,那么如何保证原先的状态与故障恢复后数据的对应关系呢?
Flink提供了CheckpointedFunction接口,让我们可以根据业务需求自行设计状态的保存和恢复逻辑,这里就不展开说了。
四、状态持久化和状态后端
(1)开启检查点
对状态进行持久化保存,可以在发生故障后进行重启恢复 。Flink对状态进行持久化的方式,就是将状态写入检查点保存到外部存储系统中。具体的存储介质,一般是分布式文件系统。因此,要相对状态进行自动持久化保存,首先就要开启检查点。调用执行环境的.enableCheckpointing()方法就可以开启检查点。
env.enableCheckpointing(1000); //每隔1s保存检查点
(2)检查点的保存流程
检查点的保存主要是JobManager TaskManager和外部存储系统三者之间的协调。具体来说: 在应用触发检查点保存时,首先由JobManager向每个TaskManager发送触发检查点命令;TaskManager收到命令后,对当前任务的状态进行快照保存,持久化到远程的存储介质;完成后向JobManager返回确认消息;JobManager只有收到所有TaskManager确认消息,才会确认当前检查点保存成功。而这一切工作的协调,就需要一个“专职人员”来完成,也就是状态后端。
(3)状态后端(state backends)
状态后端就是Flink中负责状态的存储、访问以及维护的一个可插拔组件,主要负责两件事:一是本地的状态管理,而是将检查点写入远程的持久化介质。
状态后端可以分为两类:(默认)哈希表状态后端(HashMapStateBackend)、内嵌RocksDB状态后端(EmbeddedRocksDBStateBackend)。可以通过对执行环境调用.setStateBackend()方法设置状态后端类型。
env.setStateBackend(new HashMapStateBackend());env.setStateBackend(new EmbeddedRocksDBStateBackend());
哈希表状态后端优点:本地状态放入内存,读写效率高
内嵌RocksDB状态后端优点:异步快照;增量式保存检查点机制
相关文章:
Flink状态编程
Flink处理机制的核心就是“有状态的流处理”,在某些情况下,一条数据的计算不仅要基于当前数据自身,还需要依赖数据流中的一些其他数据。这些在一个任务中,用来辅助计算的数据我们就称之为这个任务的状态。 一、按键分区状态&…...

【Django篇】--动手实现路由模块化与路由反转
一、路由模块化 在一个Django项目中,由于功能类别不同,因此需要将不同功能进行模块化设计。在Django项目中模块化设计则需要将不同模块封装为对应的app模块,每一个模块中涉及到的路由则也需要进行模块化设计,才能更好的让整个项目…...
多元统计分析练习题3
从总体 A A A 和 B B B 中分别抽取 n 10 n10 n10 个样本 假设 A , B A,B A,B 协方差矩阵相同,并且服从多元正态分布 计算得到的样本均值和样本离差阵分别为 X ‾ A ( 1 , 2 , 3 ) T , V B d i a g ( 1 , 1 , 1 ) X ‾ B ( 1.5 , 2.5 , 3.5 ) T , V B d i…...

windows remote desktop service 远程桌面RDS授权激活
windows remote desktop service 远程桌面RDS授权激活 功能介绍:操作步骤:1、添加远程桌面授权服务2、添加远程桌面授权许可 功能介绍: 本文以 windows Server 2016为例,系统默认远程桌面连接数是2个用户,如果多余两个…...
6-pandas数据读取
前言 一、分组聚合 1.groupby使用: groupby() 是 pandas 库中用于对数据进行分组操作的一个非常重要的方法。 import pandas as pddata {城市: [北京, 上海, 广州, 北京, 上海, 广州],人口: [2154, 2424, 1303, 2154, 2424, 1303],年龄: [25, 30, 35, 25, 30, 3…...
【Logback详解】
Logback详解 Logback 是一个用于 Java 应用的日志框架,它由 Log4j 的创始人 Ceki Glc 创建。Logback 分为三个模块:logback-core、logback-classic 和 logback-access。logback-classic 模块实现了 SLF4J (Simple Logging Facade for Java) API…...

Flume的概念和原理
一、Flume的概念 1、flume 作为 cloudera 开发的实时日志收集系统 2、flume一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种…...

初始nginx
华子目录 nginx介绍nginx功能介绍基础特性web服务相关功能nginx进程结构web请求处理机制 nginx进程间通信nginx启动与http连接建立http处理过程 nginx模块介绍nginx命令演示 nginx介绍 nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服…...

vulnhub靶场 Empire LupinOne
使用命令查看靶机ip,访问ip arp-scan -l 使用御剑扫描一下子域名,但是没有获取到什么有用的信息 这是一个Apache文档,没有什么用 紧接着我们尝试暴力破解,这里推荐使用ffuf工具暴力破解目录,kali自带的ffuf扫描速度贼快 参数解释…...

6-Gin 路由详解 --[Gin 框架入门精讲与实战案例]
Gin 是一个用 Go 语言编写的 HTTP Web 框架,以其高性能和简洁的 API 而闻名。它提供了一套强大的路由功能,使得开发者可以轻松地定义 URL 路由规则,并将这些规则映射到具体的处理函数(handler)。以下是关于 Gin 路由的…...

使用Lodash工具库的orderby和sortby进行排序的区别
简介 _.orderBy 和 _.sortBy 是 Lodash 库中用于排序数组的两个函数。 区别 _.orderBy 允许你指定一个或多个属性来排序,并为每个属性指定排序方向(升序或降序)。默认所有值为升序排,指定为"desc" 降序,…...
CSS面试题|[2024-12-24]
1.说一下CSS的盒模型 在HTML页面中的所有元素都可以看成是一个盒子 盒子的组成:内容content、内边距padding、边框border、外边距margin 盒模型的类型: 标准盒模型 margin border padding content IE盒模型 margin content(包括border p…...
flask-admin 在modelview 视图中重写on_model_change 与after_model_change
背景: 当我们在使用flask-admin进行WEB开发时应该第一时间想到的是竟可能使用框架推荐的modelView模型,其次才是自定义模型 baseview,因为只有modelview模型下开发才能最大限度的提高效率。 制作: 1、在modelview视图下框架会通过默认视图…...

Excel粘贴复制不完整的原因以及解决方法
在数据处理和分析的过程中,Excel无疑是不可或缺的工具。然而,在使用Excel进行复制粘贴操作时,有时会遇到粘贴不完整的情况,这可能会让人感到困惑和烦恼。本文将深入探讨Excel粘贴复制不完整的原因、提供解决方案,并给出…...

【深度学习环境】NVIDIA Driver、Cuda和Pytorch(centos9机器,要用到显示器)
文章目录 一 、Anaconda install二、 NIVIDIA driver install三、 Cuda install四、Pytorch install 一 、Anaconda install Step 1 Go to the official website: https://www.anaconda.com/download Input your email and submit. Step 2 Select your version, and click i…...

Cocos Creator 3.8.5 正式发布,更小更快更多平台!
在 Cocos Creator 3.8.5 版本中,我们做了新一轮的优化。 在加载速度、代码裁剪、平台增强等多方面做了优化,提升了开发者体验和游戏性能。 希望能够助 Cocos 开发者们的产品更上一层楼。 一、加载速度优化 1、WASM 模块延迟加载 在早期版本中,…...

Python中构建终端应用界面利器——Blessed模块
在现代开发中,命令行应用已经不再仅仅是一个简单的文本输入输出工具。随着需求的复杂化和用户体验的重视,终端界面也逐渐成为一个不可忽视的设计环节。 如果你曾经尝试过开发终端UI,可能对传统的 print() 或者 input() 函数感到不满足&#…...
Android 15 状态栏闹钟图标不显示问题修复
Android 15 状态栏闹钟图标不显示问题修复 问题描述 在 Android 15 系统中,发现即使设置了闹钟,状态栏也不会显示闹钟图标。这个问题影响了用户及时查看闹钟状态的体验。 问题分析 通过查看 SystemUI 的配置文件,发现在 frameworks/base/packages/SystemUI/res/values/conf…...

数据采集背后的效率革命:如何优化你的爬虫性能
在爬虫技术日益发展的今天,性能优化成为提升数据采集效率的关键。面对日益复杂的网页结构和庞大的数据量,高效的爬虫能够显著降低运行时间和资源成本。本文将围绕爬虫性能优化的核心方法展开讨论,并通过实例对比多进程、多线程以及普通爬取的…...

【Compose multiplatform教程06】用IDEA编译Compose Multiplatform常见问题
当我们从Kotlin Multiplatform Wizard | JetBrains 下载ComposeMultiplatform项目时 会遇到无法正常编译/运行的情况,一般网页和桌面是可以正常编译的, 我这里着重解决如下问题 1:Gradle版本不兼容或者Gradle连接超时 2:JDK版本不兼容 3:Gradle依赖库连…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...

Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...