李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
大数据
正文
25.Flink状态管理介绍
Leefs
2022-01-26 PM
1379℃
0条
[TOC] ### 前言 在传统的批处理中,数据是划分为块分片去完成的,然后每一个Task去处理一个分片。当分片执行完成后,把输出聚合起来就是最终的结果。在这个过程当中,对于state的需求还是比较小的。 对于流计算而言,对State有非常高的要求,因为在流系统中输入是一个无限制的流,会运行很长一段时间,甚至运行几天或者几个月都不会停机。在这个过程当中,就需要将状态数据很好的管理起来。 ### 一、无状态流和有状态流区别 流式计算分为**无状态**和**有状态**两种情况: **无状态** 无状态的计算观察每个独立事件,并根据最后一个事件输出结果。 例如,流处理应用程序从传感器接收温度读数,并在温度超过90度时发出警告。 **有状态** 有状态的计算则会基于多个事件输出结果。以下是一些例子。 + 所有类型的窗口。例如,计算过去一小时的平均温度,就是有状态的计算。 + 所有用于复杂事件处理的状态机。例如,若在一分钟内收到两个相差20度以上的温度读数,则发出警告,这是有状态的计算。 + 流与流之间的所有关联操作,以及流与静态表或动态表之间的关联操作, 都是有状态的计算。 **下图展示了无状态流处理和有状态流处理的主要区别:** + 无状态流处理分别接收 每条数据记录(图中的黑条),然后根据最新输入的数据生成输出数据(白条)。 + 有状态流处理会维护状态(根据每条输入记录进行更新),并基于最新输入的记录和当前的 状态值生成输出记录(灰条)。 ![25.Flink状态管理介绍01.jpg](https://lilinchao.com/usr/uploads/2022/01/1437823099.jpg) 上图中输入数据由黑条表示。 **说明** + 无状态流处理每次只转换一条输入记录,并且仅根据最新的输入记录输出结果(白条)。 + 有状态流处理维护所有已处理记录的状态值,并根据每条新输入的记录更新状态,因此输出记录(灰条)反映的是综合考虑多个事件之后的结果。 尽管无状态的计算很重要,但是流处理对有状态的计算更感兴趣。事实上,正确地实现有状态的计算比实现无状态的计算难得多。旧的流处理系统并不支持有状态的计算,而新一代的流处理系统则将状态及其正确性视为重中之重。 ### 二、状态管理概念 一般来说,所有数据都由一个task维护,并被用于计算一个函数的结果,这个函数包含于此task的state。可以认为state是一个本地变量或是一个实例变量,可以由task的业务逻辑访问。下图展示了一个task与它的state的常规交互过程: ![25.Flink状态管理介绍02.jpg](https://lilinchao.com/usr/uploads/2022/01/1886805444.jpg) **一个task接收一些输入数据。当处理数据时,task会访问state,并根据输入数据和state的信息更新它的state。** 一个简单的例子如:一个task持续计算迄今它接收到了多少条记录。当task接收到一个新的记录时,它会访问state获取当前的count数,增加count,更新state,并释放新的count作为结果输出。 Application读写state的逻辑一般较为直接并易于理解,然而高效、可靠的管理state更具有挑战性。它包括:处理超大的state(可能会超出内存),并确保在出现故障时state不会丢失等。Flink会处理所有关于state一致性、故障处理、高效存储并访问等问题,开发者仅需关注在他们的应用逻辑即可。 在Flink中,state一定是与一个特定的operator关联的。为了让Flink的runtime可以意识到一个operator的state,operator需要注册它的state。在Flink中有两种类型的state:**算子状态(operator state)和键控状态(keyed state)**。下面我们对它们做详细介绍。 ### 三、状态管理特点 + 由一个任务维护,并且用来计算某个结果的所有数据,都属于这个任务的状态; + 可以认为状态就是一个本地变量,可以被任务的业务逻辑访问; + Flink会进行状态管理,包括状态一致性、故障处理以及高效存储和访问,以便开发人员可以专注于应用程序的逻辑; + 在 Flink 中,状态始终与特定算子相关联; + 为了使运行时的Flink了解算子的状态,算子需要预先注册其状态。 ### 四、状态管理使用场景 有状态的计算是流处理框架要实现的重要功能,因为稍复杂的流处理场景都需要记录状态,然后在新流入数据的基础上不断更新状态。下面的几个场景都需要使用流处理的状态功能: - 数据流中的数据有重复,想对重复数据去重,需要记录哪些数据已经流入过应用,当新数据流入时,根据已流入过的数据来判断去重。 - 检查输入流是否符合某个特定的模式,需要将之前流入的元素以状态的形式缓存下来。比如,判断一个温度传感器数据流中的温度是否在持续上升。 - 对一个时间窗口内的数据进行聚合分析,分析一个小时内某项指标的75分位或99分位的数值。 - 在线机器学习场景下,需要根据新流入数据不断更新机器学习的模型参数。 ### 五、算子状态(Operator State) #### 5.1 概念 **算子状态 (Operator State):**顾名思义,状态是和算子进行绑定的,一个算子的状态不能被其他算子所访问到。官方文档上对 Operator State 的解释是:*each operator state is bound to one parallel operator instance*,所以更为确切的说**一个算子状态是与一个并发的算子实例所绑定的**,即假设算子的并行度是 2,那么其应有两个对应的算子状态: ![25.Flink状态管理介绍03.png](https://lilinchao.com/usr/uploads/2022/01/531997617.png) **说明** + 算子状态的作用范围限定为算子任务,由同一并行任务所处理的所有数据都可以访问到相同的状态; + 状态对于同一子任务而言是共享的; + 算子状态不能由相同或不同算子的另一个子任务访问; #### 5.2 算子状态数据结构 + **列表状态(List state)** + 将状态表示为一组数据的列表 + **联合列表状态(Union list state)** + 也将状态表示为数据的列表。它与常规列表状态的区别在于,在发生故障时,或者从保存点(savepoint)启动应用程序时如何恢复 + **广播状态(Broadcast state)** + 如果一个算子有多项任务,而它的每项任务状态又都相同,那么这种特殊情况最适合应用广播状态。 ### 六、键控状态(Keyed State) #### 6.1 概念 **键控状态 (Keyed State)** :是一种特殊的算子状态,即状态是根据 key 值进行区分的,Flink 会为每类键值维护一个状态实例。如下图所示,每个颜色代表不同 key 值,对应四个不同的状态实例。需要注意的是键控状态只能在 `KeyedStream` 上进行使用,我们可以通过 `stream.keyBy(...)` 来得到 `KeyedStream` 。 ![25.Flink状态管理介绍04.png](https://lilinchao.com/usr/uploads/2022/01/1268212767.png) **说明** + 键控状态是根据输入数据流中定义的键(key)来维护和访问的; + Flink 为每个key维护一个状态实例,并将具有相同键的所有数据,都分区到同一个算子任务中,这个任务会维护和处理这个key对应的状态; + 当任务处理一条数据时,它会自动将状态的访问范围限定为当前数据的 key。 #### 6.2 键控状态数据结构 + 值状态(Value state) + 将状态表示为单个的值 + 列表状态(List state) + 将状态表示为一组数据的列表 + 映射状态(Map state) + 将状态表示为一组 Key-Value 对 + 聚合状态(Reducing state & Aggregating State) + 将状态表示为一个用于聚合操作的列表 *附参考文章链接:* *https://blog.csdn.net/run_bigdata/article/details/104046941/* *https://www.cnblogs.com/airnew/p/9544683.html* *https://www.jianshu.com/p/5d71455cc578* *https://www.cnblogs.com/zackstang/p/11737007.html*
标签:
Flink
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/1878.html
上一篇
24.EvnetTime在window中的使用
下一篇
26.Flink状态编程操作示例
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
Typora
二叉树
数据结构
SpringCloudAlibaba
VUE
nginx
序列化和反序列化
JavaScript
Zookeeper
Redis
Spark RDD
正则表达式
LeetCode刷题
散列
ajax
Netty
Azkaban
JavaWeb
Eclipse
随笔
工具
数学
Docker
设计模式
Elastisearch
Spring
JavaSE
MyBatis-Plus
NIO
GET和POST
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭