当前位置: 首页 > news >正文

Flink笔记整理(六)

Flink笔记整理(六)

完整系列在公众号:是十三不是四十三,欢迎关注~

文章目录

  • Flink笔记整理(六)
  • 八、状态管理
    • 8.1 Flink中的状态
      • 概述
      • 状态的分类
    • 8.2 按键分区状态(Keyed State)
      • 值状态(ValueState)
      • 列表状态(ListState)
      • Map状态(MapState)
      • 归约状态(ReducingState)
      • 聚合状态(AggregatingState)
      • 状态生存时间(TTL)
    • 8.3 算子状态(Operator State)
      • 列表状态(ListState)
      • 联合列表状态(UnionListState)
      • 广播状态(BroadcastState)
    • 8.4 状态后端(State Backends)
      • 状态后端的分类(HashMapStateBackend/RocksDB)
      • 如何选择正确的状态后端
      • 状态后端的配置
  • 总结


八、状态管理

8.1 Flink中的状态

概述

在这里插入图片描述

状态的分类

  • 托管状态(Managed State)和原始状态(Raw State)

Flink的状态有两种:托管状态(Managed State)和原始状态(Raw State)。托管状态就是由Flink统一管理的,状态的存储访问、故障恢复和重组等一系列问题都由Flink实现,我们只要调接口就可以;而原始状态则是自定义的,相当于就是开辟了一块内存,需要我们自己管理,实现状态的序列化和故障恢复。
通常我们采用Flink托管状态来实现需求。

  • 算子状态(Operator State)和按键分区状态(Keyed State)
    接下来重点就是托管状态(Managed State)。

在Flink中,一个算子任务会按照并行度分为多个并行子任务执行,而不同的子任务会占据不同的任务槽(task slot)。由于不同的slot在计算资源上是物理隔离的,所以Flink能管理的状态在并行任务间是无法共享的,每个状态只能针对当前子任务的实例有效。

而很多有状态的操作(比如聚合、窗口)都是要先做keyBy进行按键分区的。按键分区之后,任务所进行的所有计算都应该只针对当前key有效,所以状态也应该按照key彼此隔离。在这种情况下,状态的访问方式又会有所不同。

基于这样的想法,又可以将托管状态分为两类:算子状态和按键分区状态。

在这里插入图片描述
聚合算子必须在keyBy之后才能用
另外,也可以通过富函数类(Rich Function)来自定义Keyed State,所以只要提供了富函数类接口的算子,也都可以使用Keyed State。所以即使是map、filter这样无状态的基本转换算子,我们也可以通过富函数类给它们“追加”Keyed State。比如RichMapFunction、RichFilterFunction。在富函数中,我们可以调用.getRuntimeContext()获取当前的运行时上下文(RuntimeContext),进而获取到访问状态的句柄;这种富函数中自定义的状态也是Keyed State。从这个角度讲,Flink中所有的算子都可以是有状态的。
无论是Keyed State还是Operator State,它们都是在本地实例上维护的,也就是说每个并行子任务维护着对应的状态,算子的子任务之间状态不共享。

8.2 按键分区状态(Keyed State)

按键分区状态(Keyed State)顾名思义,是任务按照键(key)来访问和维护的状态。它的特点非常鲜明,就是以key为作用范围进行隔离。

需要注意,使用Keyed State必须基于KeyedStream。没有进行keyBy分区的DataStream,即使转换算子实现了对应的富函数类,也不能通过运行时上下文访问Keyed State。

Flink按键分区状态(Keyed State)以及代码

值状态(ValueState)

ValueState

列表状态(ListState)

ListState

Map状态(MapState)

ValueState

归约状态(ReducingState)

ReducingState

聚合状态(AggregatingState)

AggregatingState

状态生存时间(TTL)

TTL

8.3 算子状态(Operator State)

算子状态(Operator State)就是一个算子并行实例上定义的状态,作用范围被限定为当前算子任务。算子状态跟数据的key无关,所以不同key的数据只要被分发到同一个并行子任务,就会访问到同一个Operator State。

算子状态的实际应用场景不如Keyed State多,一般用在Source或Sink等与外部系统连接的算子上,或者完全没有key定义的场景。比如Flink的Kafka连接器中,就用到了算子状态。

当算子的并行度发生变化时,算子状态也支持在并行的算子任务实例之间做重组分配。根据状态的类型不同,重组分配的方案也会不同。

算子状态也支持不同的结构类型,主要有三种:ListState、UnionListState和BroadcastState。

列表状态(ListState)

ListState

联合列表状态(UnionListState)

UnionListState

广播状态(BroadcastState)

BroadcastState

8.4 状态后端(State Backends)

在Flink中,状态的存储、访问以及维护,都是由一个可插拔的组件决定的,这个组件就叫作状态后端(state backend)。状态后端主要负责管理本地状态的存储方式和位置。

状态后端的分类(HashMapStateBackend/RocksDB)

状态后端的分类

如何选择正确的状态后端

如何选择正确的状态后端

状态后端的配置

状态后端的配置


总结

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • WordPress资源下载类主题 CeoMax-Pro_v7.6绕授权开心版
  • 函数递归(第十九天)
  • Spring中ImportBeanDefinitionRegistrar源码和使用
  • idea使用free流程,2024idea、2023idea都可以安装免费使用
  • 【Scene Transformer】scene transformer论文阅读笔记
  • jupyter支持跨机器远程访问
  • C语言——数组和排序
  • 赛蓝企业管理系统 AuthToken/Index 身份认证绕过漏洞复现
  • Redis1
  • vscode的json文件解析
  • Halcon学习之create_shape_model案例分解
  • TiDB系列之:使用Flink TiDB CDC Connector采集数据
  • Java中的Map(如果想知道Java中有关Map的知识点,那么只看这一篇就足够了!)
  • 【过题记录】 8.3
  • CTFHUB-SSRF-DNS重绑定 Bypass
  • php的引用
  • 【React系列】如何构建React应用程序
  • bootstrap创建登录注册页面
  • codis proxy处理流程
  • happypack两次报错的问题
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Octave 入门
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • ucore操作系统实验笔记 - 重新理解中断
  • underscore源码剖析之整体架构
  • Vue 2.3、2.4 知识点小结
  • 阿里云Kubernetes容器服务上体验Knative
  • 翻译--Thinking in React
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 机器学习中为什么要做归一化normalization
  • 前端相关框架总和
  • 使用Gradle第一次构建Java程序
  • 使用putty远程连接linux
  • 小李飞刀:SQL题目刷起来!
  • PostgreSQL之连接数修改
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • #162 (Div. 2)
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • $forceUpdate()函数
  • (1)无线电失控保护(二)
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (python)数据结构---字典
  • (纯JS)图片裁剪
  • (六)Flink 窗口计算
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (一)模式识别——基于SVM的道路分割实验(附资源)
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)h264中avc和flv数据的解析
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转)一些感悟
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation