【Flink】一文解析Flink如何实现状态管理和容错机制

news2024/11/23 8:52:33

文章目录

  • 一 Flink中的状态管理
    • 1 有状态的算子和应用程序
      • (1)算子状态(operator state)
      • (2)键控状态(keyed state)
    • 2 状态后端
    • 3 选择一个状态后端
  • 二 Flink中的容错机制
    • 1 一致性检查点
      • (1)程序执行
      • (2)从检查点恢复状态
      • (3)重启应用
      • (4)从检查点恢复状态
      • (5)重新消费

一 Flink中的状态管理

流式计算分为无状态和有状态两种情况。无状态的计算观察每个独立事件,并根据最后一个事件输出结果。例如,流处理应用程序从传感器接收温度读数,并在温度超过90度时发出警告。有状态的计算则会基于多个事件输出结果。以下是一些例子。

  • 所有类型的窗口。例如,计算过去一小时的平均温度,就是有状态的计算。
  • 所有用于复杂事件处理的状态机。例如,若在一分钟内收到两个相差20度以上的温度读数,则发出警告,这是有状态的计算。
  • 流与流之间的所有关联操作,以及流与静态表或动态表之间的关联操作,都是有状态的计算。

下图展示了无状态流处理和有状态流处理的主要区别。无状态流处理分别接收每条数据记录(图中的黑条),然后根据最新输入的数据生成输出数据(白条)。有状态流处理会维护状态(根据每条输入记录进行更新),并基于最新输入的记录和当前的状态值生成输出记录(灰条)。

在这里插入图片描述

上图中输入数据由黑条表示。无状态流处理每次只转换一条输入记录,并且仅根据最新的输入记录输出结果(白条)。有状态 流处理维护所有已处理记录的状态值,并根据每条新输入的记录更新状态,因此输出记录(灰条)反映的是综合考虑多个事件之后的结果。

尽管无状态的计算很重要,但是流处理对有状态的计算更感兴趣。事实上,正确地实现有状态的计算比实现无状态的计算难得多。旧的流处理系统并不支持有状态的计算,而新一代的流处理系统则将状态及其正确性视为重中之重。
在这里插入图片描述

Flink中的状态

  • 由一个任务维护,并且用来计算某个结果的所有数据,都属于这个任务的状态。
  • 可以认为状态就是一个本地变量,可以被任务的业务逻辑访问。
  • Flink 会进行状态管理,包括状态一致性、故障处理以及高效存储和访问,以便开发人员可以专注于应用程序的逻辑。
  • 在 Flink 中,状态始终与特定算子相关联。
  • 为了使运行时的 Flink 了解算子的状态,算子需要预先注册其状态。

1 有状态的算子和应用程序

Flink内置的很多算子,数据源source,数据存储sink都是有状态的,流中的数据都是buffer records,会保存一定的元素或者元数据。例如: ProcessWindowFunction会缓存输入流的数据,ProcessFunction会保存设置的定时器信息等等。

在Flink中,状态始终与特定算子相关联。总的来说,有两种类型的状态:

  • 算子状态(operator state):可见范围为当前任务槽(一个并行任务)。
  • 键控状态(keyed state):可将范围为当前key。

(1)算子状态(operator state)

算子状态的作用范围限定为算子任务。这意味着由同一并行任务所处理的所有数据都可以访问到相同的状态,状态对于同一任务而言是共享的。算子状态不能由相同或不同算子的另一个任务访问。

在这里插入图片描述

Flink为算子状态提供三种基本数据结构:

  • 列表状态(List state):将状态表示为一组数据的列表。
  • 联合列表状态(Union list state):也将状态表示为数据的列表。它与常规列表状态的区别在于,在发生故障时,或者从保存点(savepoint)启动应用程序时如何恢复。
  • 广播状态(Broadcast state):如果一个算子有多项任务,而它的每项任务状态又都相同,那么这种特殊情况最适合应用广播状态。

(2)键控状态(keyed state)

键控状态是根据输入数据流中定义的键(key)来维护和访问的。Flink为每个键值维护一个状态实例,并将具有相同键的所有数据,都分区到同一个算子任务中,这个任务会维护和处理这个key对应的状态。当任务处理一条数据时,它会自动将状态的访问范围限定为当前数据的key。因此,具有相同key的所有数据都会访问相同的状态。Keyed State很类似于一个分布式的key-value map数据结构,只能用于KeyedStream(keyBy算子处理之后)。

在这里插入图片描述

Flink的Keyed State支持以下数据类型:

  • 值状态:ValueState[T]保存单个的值,值的类型为T。
    • get操作: ValueState.value()
    • set操作: ValueState.update(value: T)
  • 列表状态:ListState[T]保存一个列表,列表里的元素的数据类型为T。基本操作如下:
    • ListState.add(value: T)
    • ListState.addAll(values: java.util.List[T])
    • ListState.get()返回Iterable[T]
    • ListState.update(values: java.util.List[T])
  • 字典状态:MapState[K, V]保存Key-Value对。
    • MapState.get(key: K)
    • MapState.put(key: K, value: V)
    • MapState.contains(key: K)
    • MapState.remove(key: K)

State.clear()是清空操作,减少内存、HDFS、状态后端的存储压力。

2 状态后端

  • 每传入一条数据,有状态的算子任务都会读取和更新状态。
  • 由于有效的状态访问对于处理数据的低延迟至关重要,因此每个并行任务都会在本地维护其状态,以确保快速的状态访问。
  • 状态的存储、访问以及维护,由一个可插入的组件决定,这个组件就叫做状态后端(state backend)。
  • 状态后端主要负责两件事:本地的状态管理(当前任务机器上面的JVM堆,其实就是内存),以及将检查点(checkpoint)状态写入远程存储(HDFS、RocksDB 之类的)。

3 选择一个状态后端

  • MemoryStateBackend

    内存级的状态后端,会将键控状态作为内存中的对象进行管理,将它们存储在TaskManager的JVM堆上;而将checkpoint存储在JobManager的内存中。

    特点:快速、低延迟,但不稳定。

  • FsStateBackend

    将checkpoint存到远程的持久化文件系统(FileSystem)上。而对于本地状态,跟MemoryStateBackend一样,也会存在TaskManager的JVM堆上。

    同时拥有内存级的本地访问速度,和更好的容错保证。

  • RocksDBStateBackend

    将所有状态序列化后,存入本地的RocksDB中存储。

    RocksDB 是一个硬盘 KV 数据库,LevelDB,RocketDB。

自己设定一个检查点:

public static void main(String[] args) throws Exception{
    StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    env.setParallelism(1);
    // 第二个参数设置为异步保存还是同步保存
    env.setStateBackend(new FsStateBackend("file:\\E:\\develop\\MyWork\\flink2022tutorial\\src\\main\\resources\\checkpoint",false));
    // 间隔10s保存一次检查点,默认只保存最近一次的检查点
    // 因为使用最近一次的检查点就可以恢复程序
    env.enableCheckpointing(10 * 1000L);

    env
            .addSource(new Example1.ClickSource())
            .print();

    env.execute();
}

二 Flink中的容错机制

1 一致性检查点

Flink 故障恢复机制的核心,就是应用状态的一致性检查点。

有状态流应用的一致检查点,其实就是所有任务的状态,在某个时间点的一份拷贝(一份快照);这个时间点,应该是所有任务都恰好处理完一个相同的输入数据(其实就是检查点屏障)的时候。

(1)程序执行

例子:分别求1-5中奇偶数的和。

		env
                .fromElements(1,2,3,4,5)
                .keyBy(r -> r % 2)
                .sum(0)
                .print();

下图的上游是一个kafka消息队列,偏移量的值就是元素的值。对应的一致性检查点如下图:

在这里插入图片描述

(2)从检查点恢复状态

如果消费完7,在向奇数相加的任务槽传递过程中,机器出现了问题,如下图。

在这里插入图片描述

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

(3)重启应用

在这里插入图片描述

遇到故障之后,第一步就是重启应用,重启应用后,Flink会清空其内部的所有状态。

(4)从检查点恢复状态

在这里插入图片描述

第二步是从 checkpoint 中读取状态,根据状态变量中状态描述符的定义字符串的名字恢复,将状态重置。

从检查点重新启动应用程序后,其内部状态与检查点完成时的状态完全相同。

此时注意从上游已经消费完7,下一个数据消费8,但恢复完之后,又变为原始状态,所以这就需要上游的存储设备是一个可重置读取偏移量的持久化设备,可以回退读取位置。

(5)重新消费

在这里插入图片描述

第三步:开始消费并处理检查点到发生故障之间的所有数据。

这种检查点的保存和恢复机制可以为应用程序内部状态提供“精确一次”(exactly-once,每一个数据只会被计算一次,遇到回退现象,需要将加上的数字再减去)的一致性,因为所有算子都会保存检查点并恢复其所有状态,这样一来所有的输入流就都会被重置到检查点完成时的位置。

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

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

相关文章

自建传奇2服务器,分享自己架设传奇服务器的详细介绍

我们在经历了太多的传奇私服之后就会有人想要自己搞一个来看看,其实有这样想法的人其实还是很多的,毕竟当一个玩家总没有当一个GM来的实在。于是就有人选择自己去架设传奇私服的服务器,而这个时候我们的信息就能够给这些想要自己当GM的人一个…

uniapp多端问题总结

页面跳转相关 1、页面跳转传参报错 问题: 小程序报错 SyntaxError: Unexpected end of JSON inputat JSON.parse () 原因:是由于JSON.parse无法识别某些url中的特殊字符比如&等特殊符号。解决办法: 原来代码: // 跳转所属专…

【Linux】—一文掌握Linux基本命令(上)

目录lspwdcdtouchmkdirrmdir与rmmantree 的安装cpmvnano的安装catls 语法: ls [选项][目录或文件] 功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。 常用拓展选项: -a 列出…

J-Tech Talk|以型搜型:3D模型表征助力3D神经搜索!

以型搜型指的是 以3D模型搜索3D模型,在对 3D 物体进行模型表征后,通过最近邻搜索得到与之类似的3D物体的结果。Executor-3d-encoder 项目集成了若干个 3D 物体表征模型,开发者可以很方便地对不同的模型进行统一配置、训练和微调。12 月 6 日晚…

网上中国:“云签约”,真方便

文章目录“云签约”,真方便足不出户就能签合同电子签名行业发展迅速确保合同不被篡改“云签约”,真方便 通过线上面签,商品房买卖双方不见面就能完成交易流程;有了电子劳务合同,企业用工实现一键签约;借助…

体验 Node.js 的 net 模块

1. 创建客户端 模拟 http 请求,将接收到的响应体内容原样输出,接收完毕后,关闭连接 1.1 最终效果 接收到的数据: 解析后的数据: 1.2 流程说明 初始化: 创建客户端 const client net.createConnection…

美国高防服务器到底好不好用

对于对安全性配置有较高要求的用户来说,一般的独立服务器似乎并不能满足其需求。他们一般会选择带有DDoS或CC攻击防御功能或者流量清洗功能的高防服务器。而本文所要介绍的美国高防服务器也是众多海内外用户比较青睐的一大产品选择。那么美国高防服务器到底好不好用…

设计原则和设计模式

一:软件设计原则 1.单一职责原则: 有且只有一个原因引起类的变化(类或者接口的职责单一化) 2.里氏替换原则: 子类可以扩展父类的功能,但不能改变父类原有的功能 3.依赖倒置原则: 1.高层模块不应该依赖于底层模块&#xff0c…

机器学习2普通knn算法

文章目录KNN算法-k近邻算法(k-Nearest Neighbors)前言KNN优点:快捷键:一、普通knn算法是什么?解析:二、普通knn算法基础1.分布解析2.使用pycharm函数封装的形式运行KNN算法3.使用scikit-learn中的knn三、普…

《Redis基础篇》带你走进Redis的世界 ~ ⭐必看必看⭐

文章目录1. NoSQL数据库简介1.1 技术发展1.1.1. Web1.0时代1.1.2 Web2.0时代1.1.3. 解决CPU及内存压力(采用分布式)1.1.4. 解决IO压力1.2. NoSQL数据库1.2.1. NoSQL数据库概述1.2.2 NoSQL适用场景1.2.3 NoSQL不适用场景1.2.4 Memcache1.2.5 Redis1.2.6. MongoDB1.3. 行式存储数…

新的datax启动方式(直接使用java命令启动)

一开始用的python启动 (很烦 还得有python环境 但是本着项目上线可以给客户装个python环境 也就用了) 后续需要做个客户端 开始呢下载了源码直接再源码中启动(但是多个任务都在一个jvm中 我很抵触这样做) 又研究研究python启动的源码 发现最后还是调用…

Lerna入门与实战

一、Lerna简介 1.1 lerna背景 维护过多个package项目的同学可能都会遇到一个问题:package是放在一个仓库里维护还是放在多个仓库里单独维护。当package数量较少的时候,多个仓库维护不会有太大问题,但package数量逐渐增多时,一些…

数据驱动运营成功案例——内蒙古国大药房

国药控股国大药房内蒙古有限公司(以下简称“内蒙古国大药房”),自2003年成立以来,销售额以每年35%以上的速度增长,现有直营门近400家,分布覆盖呼和浩特、包头、呼伦贝尔、乌兰察布、巴彦淖尔、赤峰、满洲里…

新加坡国立大学尤洋:我的四个选择,本质的喜欢催动长久的坚持丨青源专栏...

为了启发青年学者思考职业发展,激发科研灵感,智源社区推出青源专栏,定期邀请青源会员分享他们的研究思考和科研感悟。新加坡国立大学计算机系校长青年教授、青源会会员尤洋分享了他在高性能计算研究、创业经历以及在新加坡的生活所感。从求学…

006. 分割回文串

1.题目链接: 131. 分割回文串 2.解题思路: 2.1.题目要求: 给一个字符串 s ,要求把 s 分割成一些子串,并使每个子串都是 回文串。 回文串的概念:正反顺序都一样的字符串。 举例: 输入&#…

IC模拟版图工程师高薪进阶之路,三年实现年薪30w+

模拟版图是模拟IC设计岗位的一种,随着国内半导体行业的不断发展,岗位的需求也越来越多。而每个芯片最终能够付诸于生产都离不开模拟版图设计师的功劳,所以目前芯片产业对于这类人才需求越来越大。 什么是模拟版图设计工程师? 模…

BSA牛血清白蛋白修饰Fe3O4纳米颗粒 BSA-MION

产品名称:BSA牛血清白蛋白修饰Fe3O4纳米颗粒 英文名称:BSA-MION 用途:科研 状态:固体/粉末/溶液 产品规格:1g/5g/10g 保存:冷藏 储藏条件:-20℃ 储存时间:1年 牛血清中的简单蛋白&am…

2022年第十一届认证杯数学中国数学建模国际赛小美赛:D题野生动物贸易是否应该长期禁止建模方案及代码实现

更新进展 (1)2022-12-2 9:00 发布预售 (2)2022-12-2 10:40 发布建模思路、代码以及参考文献 (3)待更新内容:进一步对全部数据分析 1 题目 野生动物市场被怀疑是当前疫情和2002年SARS疫情的…

blender中的灯光和相机

灯光环境光灯光基础灯光基本属性 EV渲染器日光面光天空盒IES灯光 (灯光遮罩)自发光移动摄像机切换摄像机摄像机属性环境光 在渲染视图中,没有任何光时,物体只受环境光的影响 灯光基础 1 四种灯光,点光,…

安卓期末大作业——仿番茄免费小说APP

《移动应用开发实践》实践报告 APP名称: 番茄免费小说 要求: 格式:宋体,小四号字;首行缩进;行距:1.5倍。 每人独立完成Android App的设计与开发App必须包含SOLite数据库操作 一、所调查的Ap…