Flink有状态计算

news2024/10/18 20:42:47

前言

状态是什么?状态就是数据,准确点说,状态是指 Flink 作业计算时依赖的历史数据或中间数据。如果一个 Flink 作业计算依赖状态,那它就是有状态计算的作业,反之就是无状态计算的作业。

举个例子,服务端应用为了方便扩缩容,一般会设计成无状态的,但是对外服务的接口又是有状态的,这是因为服务端应用本身不存储数据,数据存储在关系型或非关系型数据库中,此时的“状态”就从服务端迁移到数据库中了。

Flink 同理,一个稍微复杂一点的作业,基本都会使用到状态。Flink 作为一款强大的开源流处理框架,以其卓越的性能和丰富的功能备受瞩目,如何实现状态的高效访问和容错恢复,是 Flink 不得不解决的问题。

Flink有状态计算方案

Flink 是不是也可以效仿服务端应用,把状态数据存储在数据库中呢?这么做当然可以,但是会存在以下几个问题:

  • 数据库种类这么多,Flink 难以适配所有数据库,且容错恢复的成本很高
  • 开发者使用状态,必须了解状态存储的细节,使用门槛较高
  • 状态访问难以形成统一的接口,徒增使用门槛
  • 数据库的访问性能会增加 Flink 作业的延迟

以上这些问题里,最最重要的是性能问题。在大数据流处理场景中,处理的数据量是非常庞大的,单单是动辄几十万甚至百万的TPS,就不是传统数据库能承受的,况且还要考虑到Flink和数据库交互产生网络IO的额外开销。

基于这些问题,Flink 自己实现了一套状态的访问和存储方案:

  • 状态本地化 如果Flink通过网络去访问状态,必然会导致较高的延迟和低吞吐问题。Flink 直接状态本地化,将状态存储在subTask本地内存或磁盘上,这样就可以将状态的访问耗时从毫秒级直接优化到微妙甚至纳秒级,实现状态的极致访问速度。
  • 一致性快照实现容错 传统的有状态计算方案,为了实现异常容错时的数据处理和状态结果满足精准一次的一致性要求,往往会使用事务机制,大大增加用户的开发成本。Flink 自身实现了状态一致性的异常容错的逻辑,用户无需参与。Flink 以 Chandy-Lamport 分布式系统快照算法作为理论基础,实现了名为 Checkpoint 的分布式轻量级异步快照,保证了精确一次的数据处理和一致性状态,数据既不会多算,也不会少算。
  • 统一的状态访问接口 Flink提供了一套统一的状态访问接口,用户基于这套接口,不但能享受状态本地化带来的极致的访问速度,还够得到状态持久化和一致性快照带来的异常容错场景下精确一次的数据处理保证。

状态接口

Flink 状态的顶层接口是org.apache.flink.api.common.state.State,基于此派生出五个常用的子接口。

画板

  • ValueState 用于存储单个值的状态接口
  • MapState 用于存储键值对的状态接口
  • ListState 用于存储列表值的状态接口
  • ReducingState 用于存储归约状态的接口,添加进去的状态会先经过ReduceFunction和旧值进行归约计算并保存
  • AggregatingState 用于存储归约状态的接口,添加进去的状态会先经过AggregateFunction和旧值进行归约计算并保存,和ReducingState的区别是中间数据可以和输入数据类型不一致

键值状态和算子状态

Flink 将状态是否要根据Key分组,将状态划分为 **键值状态(Keyed State)算子状态(Operator State)**两类。

键值状态只能在 KeyedStream 上使用,数据先经过 keyBy 分组,相同key的数据共享同一个键值状态。算子状态的作用范围是当前subTask,同一个subTask共享同一个算子状态。另外,键值状态支持的状态类型更丰富,算子状态只支持 ListState 状态类型,这主要是为了算子并行度发生变化时方便状态的重分配。

要想使用算子状态,只需要在 KeyedStream 上应用 ProcessFunction,通过RuntimeContext 获取状态对象来访问状态即可。

keyedStream.process(new ProcessFunction<Integer, Integer>() {
    ValueState<Integer> sumState;

    @Override
    public void open(Configuration parameters) throws Exception {
        // 获取状态对象
        sumState = getRuntimeContext().getState(new ValueStateDescriptor<Integer>("sum", Integer.class));
    }

    @Override
    public void processElement(Integer value, ProcessFunction<Integer, Integer>.Context context, Collector<Integer> collector) throws Exception {
        sumState.value();// 访问状态
        sumState.update();// 更新状态
    }
})

算子状态可以在任意算子中使用,但是被限制只能用 ListState 状态类型。要使用算子状态,要实现 CheckpointedFunction 接口,通过重写 initializeState() 来恢复算子状态,重写 snapshotState() 在执行快照时存储状态。

public class MyProcess implements CheckpointedFunction {
    ListState<Integer> listState;

    @Override
    public void snapshotState(FunctionSnapshotContext functionSnapshotContext) throws Exception {
        // 执行快照,存储状态
        listState.add();
    }

    @Override
    public void initializeState(FunctionInitializationContext functionInitializationContext) throws Exception {
        listState = functionInitializationContext.getOperatorStateStore().getListState(
                new ListStateDescriptor<Integer>("elements", Integer.class)
        );
        // 从异常中恢复状态
        if (functionInitializationContext.isRestored()) {
            Iterator<Integer> iterator = listState.get().iterator();
            while (iterator.hasNext()) {
                iterator.next();
            }
        }
    }
}

状态后端

Flink 状态本地化后,状态直接存储在subTask内存或本地磁盘中,避免了通过网络来访问状态,实现了极致的访问速度。但是随之而来的问题就是,subTask 崩溃后的数据容错和恢复。Flink 基于 Chandy-Lamport 分布式系统快照算法实现了名为 Checkpoint 的分布式轻量级异步快照,Flink 会周期性的触发 Checkpoint 操作,将subTask本地的状态数据持久化到远程分布式文件系统中,这个部分被 Flink 设计成可插拔的组件:后端组件(State Backend)。

下面是 Flink 支持的几种常用 State Backend:

  • HashMapStateBackend 底层使用哈希表将状态数据存储在subTask内存中,状态的访问效率特别高,但是受限于机器自身的内存限制,存储的状态数据量有限。
  • EmbeddedRocksDBStateBackend 将状态数据存储到内嵌的 RocksDB 数据库中,RocksDB是Facebook基于levelDB使用C编写的嵌入式K-V存储引擎,因为数据是保存在磁盘上的,它的状态访问性能虽然不如HashMapStateBackend,但它的存储能力是惊人的,甚至可以达到TB级别,非常适合处理大状态、长窗口的有状态计算作业,Checkpoint 时将数据快照写入远程分布式文件系统。
  • FsStateBackend 基于文件系统的状态后端,subTask将数据存储在内存中,Checkpoint 时将数据快照写入远程分布式文件系统。

以 FsStateBackend 为例,在作业中指定状态后端的示例代码如下:

StreamExecutionEnvironment environment = StreamExecutionEnvironment.getExecutionEnvironment();
// Checkpoint频率
environment.enableCheckpointing(1000, CheckpointingMode.EXACTLY_ONCE);
environment.getCheckpointConfig().enableExternalizedCheckpoints(CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);
// 状态后端配置
environment.setStateBackend(new FsStateBackend("file:///Users/panchanghe/temp/flink/state"));

尾巴

Flink 提供了一套统一且易用的状态接口API,基于这套接口开发者可以方便地开发出一个精准处理一次的有状态计算作业。Flink 通过将状态本地化,实现了极致的状态访问速度,避免了通过网络访问状态数据导致的高延时和低吞吐的问题。为了实现数据的精准一次处理,保证数据的不多算也不少算,Flink 实现了 Checkpoint 轻量级分布式快照算法,通过定时把subTask本地的状态数据持久化到远程的分布式文件系统来实现异常容错恢复。

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

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

相关文章

【高阶数据结构】揭开红黑树‘恶魔’的面具:深度解析底层逻辑

高阶数据结构相关知识点可以通过点击以下链接进行学习一起加油&#xff01;二叉搜索树AVL树 大家好&#xff0c;我是店小二&#xff0c;欢迎来到本篇内容&#xff01;今天我们将一起探索红黑树的工作原理及部分功能实现。红黑树的概念相对抽象&#xff0c;但只要我们一步步深入…

单链表算法题(二)(超详细版)

前言 : 通过算法题 &#xff0c; 学习解决问题的思路 &#xff0c; 再面对类似的算法题时 &#xff0c; 能快速定位解决方案 一 . 链表的回文结构 链表的回文结构 : 链表的回文结构_牛客题霸_牛客网 思路一 : 创建新链表 &#xff0c; 对原链表进行反转&#xff0c;结果存储在…

计算机毕业设计Python深度学习房价预测 房源可视化 房源爬虫 二手房可视化 二手房爬虫 递归决策树模型 机器学习 深度学习 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 房地产是促进我国经济持续增…

Google play开发者账号被封,申诉就有机会,别不信

在谷歌上架&#xff0c;开发者账号被封对很多开发者来说已经是家常便饭了&#xff0c;虽说一直都有在流传申诉没有用。别灰心啊&#xff0c;申诉就有机会&#xff0c;不少开发者都申诉成功了。 尤其是用一个少一个、价值好几个w的老号&#xff0c;不申诉就认栽实在是太亏了&…

Bootstrap 弹出框(Popover)插件

弹出框&#xff08;Popover&#xff09;与工具提示&#xff08;Tooltip&#xff09;类似&#xff0c;提供了一个扩展的视图。如需激活弹出框&#xff0c;用户只需把鼠标悬停在元素上即可。弹出框的内容完全可使用 Bootstrap 数据 API&#xff08;Bootstrap Data API&#xff09…

Mysql底层原理详细剖析

1. 索引数据结构 索引是帮助mysql 是帮助数据排序 且高效获取数据的数据结构 索引的数据结构有&#xff1a; 二叉树红黑树hash表b树 1.1 二叉查找树 二叉查找树 如果要查找&#xff0c;通过二分查找的复杂度进行查找数据&#xff0c;确实优化了性能&#xff0c;减少了io的…

【中危】Oracle TNS Listener SID 可以被猜测

一、漏洞详情 Oracle 打补丁后&#xff0c;复测出一处中危漏洞&#xff1a;Oracle TNS Listener SID 可以被猜测。 可以通过暴力猜测的方法探测出Oracle TNS Listener SID&#xff0c;探测出的SID可以用于进一步探测Oracle 数据库的口令。 建议解决办法&#xff1a; 1. 不应该使…

机器学习—特性缩放

特性缩放的技术能使梯度下降运行得更快&#xff0c;让我们先来看看功能大小之间的关系&#xff0c;这就是该特性的数字和相关参数的大小&#xff0c;作为一个具体的例子&#xff0c;让我们用两个特征来预测房子的价格&#xff0c;X1代表一个房子的大小&#xff0c;X2代表两个卧…

python爬取themoviedb电影网站信息

python爬取themoviedb电影网站信息 一、寻找数据接口二、解析主页数据,获取详情页url三、向详情页url发送请求、获取并解析数据四、完整代码一、寻找数据接口 打开网站首页,F12打开开发者工具,刷新页面。 向下滑动页面,点击页面上的“Load More”图标。 寻找到数据接口,…

掘金2.计算位置 x 到 y 的最少步数(简单01)

public class Main {public static int solution(int xPosition, int yPosition) {int diff (yPosition - xPosition);// 计算差值if(diff < 0)diff * -1;int steps 0; // 初始化步数int begin 0;// 初始化当前位置int step 1;//初始化步长// 循环直到到达目标位置while…

DSVPN简介与应用

目录 简介 DSVPN 封装模式 Nomal&#xff08;动态&#xff09;方式建立DSVPN 一、配置缺省包过滤 二、划分区域&#xff08;以总部为例&#xff09; 三、配置IP地址&#xff08;以R1为例&#xff09; 四、配置DSVPN 简介 DSVPN DSVPN&#xff08;Dynamic Secure Vir…

一种3D打印跑车模型LED安全夜灯

我学习入门单片机及3Dmax的副产品&#xff0c;小玩意。MCU用8脚的就好&#xff0c;多脚功能复用&#xff0c;涉及长短按中断、ADC、掉电唤醒及LED切换控制&#xff0c;硬件的充放电监控及光控等等麻雀虽小五脏俱全。发使用指南不是广告&#xff0c;感觉这样才能毫无遗漏的说明其…

动态规划(1)斐波那契数列模型

动态规划算法流程&#xff1a; 1、状态表示&#xff1a; 指的是dp&#xff08;dynamic programming&#xff09;表里面的值所表示的含义 如何得出&#xff1a;1、题目要求 2、经验题目要求 3、分析问题的过程中发现重复子问题 2、状态转移方程 dp[i]等于什么 3、初始化 保证…

RAG拉满-上下文embedding与大模型cache

无论怎么选择RAG的切分方案&#xff0c;仍然切分不准确。 最近&#xff0c;anthropics给出了补充上下文的embedding的方案&#xff0c;RAG有了新的进展和突破。 从最基础的向量查询&#xff0c;到上下文embedding&#xff0c;再到rerank的测试准确度都有了明显的改善&#xf…

【无标题】如何在Costura.Fody生成时排除掉某些dll

有个场景需要排除掉某些dll让他不要打包到exe中,这样做,修改FodyWeavers.xml

配合工具,快速学习与体验electron增量更新

有任何问题&#xff0c;都可以私信博主&#xff0c;共同探讨学习。 正文开始 前言一、如何使用源码1.1 下载代码1.2 下载资源1.3 运行项目 二、如何使用工具2.1 打包新版本更新包2.2 创建nginx文件服务器2.3 在文件服务器保存软件更新包 三、如何测试更新3.1本地运行低版本3.2 …

九、PESocket通信

知识点&#xff1a;高并发 1、下载PESocket 地址&#xff1a;PlaneZhong/PESocket: A C# Network Library. (github.com) 2、示例代码 发过去一个Hello&#xff0c;返回一个hello 当一个客户端关闭了&#xff0c;会出现一个提示 当一个客户端开启&#xff0c;会显示已连接 3…

运放类公式计算

简介 很多运放的GAIN采用dB的方式表达放大倍数&#xff0c;然而我们有时候习惯使用电压的倍数代表运放放大关系&#xff0c;本章主要简单介绍dB与电压转换的关系。 例如某运放的放大倍数如下&#xff1a; G1G2GAIN(dB)0029.60119.110131116 以上放大倍数我们无法知道输入的信号…

有趣的在线可视化网站:探索神经网络与矩阵运算

有趣的在线可视化网站&#xff1a;探索神经网络与矩阵运算 文章目录 有趣的在线可视化网站&#xff1a;探索神经网络与矩阵运算一 TensorFlow Playground 神经网络二 Symbolab 的矩阵迹计算器三 Matrixmultiplication 可视化教学工具 本文推荐了几个非常有趣且实用的在线可视化…

sql实战解析-sum()over(partition by xx order by xx)

该窗口函数功能 sum( c )over( partition by a order by b) 按照一定规则汇总c的值&#xff0c;具体规则为以a分组&#xff0c;每组内按照b进行排序&#xff0c;汇总第一行至当前行的c的加和值。 从简单开始一步一步讲&#xff0c; 1、sum( )over( ) 对所有行进行求和 2、sum(…