【大数据】Flink 中的状态管理

Flink 中的状态管理

  • 1.算子状态
  • 2.键值分区状态
  • 3.状态后端
  • 4.有状态算子的扩缩容
    • 4.1 带有键值分区状态的算子
    • 4.2 带有算子列表状态的算子
    • 4.3 带有算子联合列表状态的算子
    • 4.4 带有算子广播状态的算子

在前面的博客中我们指出,大部分的流式应用都是有状态的。很多算子都会不断地读取并更新某些状态,例如:窗口内收集的记录,输入源的读取位置或是一些定制的,诸如机器学习模型之类的特定应用状态。无论是内置状态还是用户自定义状态,Flink 对它们都一视同仁。本篇博客我们会对 Flink 支持的不同类别的状态进行介绍。我们将解释如何利用 状态后端state backend)对状态进行存储和维护,以及有状态的应用如何通过状态再分配实现扩缩容。

通常意义上,函数里所有需要任务去维护并用来计算结果的数据都属于任务的状态。你可以把状态想象成任务的业务逻辑所需要访问的本地或实例变量。下图展示了某个任务和它状态之间的典型交互过程。

在这里插入图片描述
任务首先会接收一些输入数据。在处理这些数据的过程中,任务对其状态进行读取或更新,并根据状态和输入数据计算结果。我们以一个持续计算接收到多少条记录的简单任务为例。当任务收到一个新的记录后,首先会访问状态获取当前统计的记录数目,然后把数目增加并更新状态,最后将更新后的数目发送出去。

应用读写状态的逻辑通常都很简单,而难点在于如何高效、可靠地管理状态。这其中包括如何处理数量巨大、可能超出内存的状态,如何保证发生故障时状态不会丢失。所有和状态一致性、故障处理以及高效存取相关的问题都由 Flink 负责搞定,这样开发人员就可以专注于自己的应用逻辑。

在 Flink 中,状态都是和特定算子相关联。为了让 Flink 的运行层知道算子有哪些状态,算子需要自己对其进行注册。根据 作用域 的不同,状态可以分为两类:算子状态operator state)和 键值分区状态keyed state),我们将在接下来介绍它们。

1.算子状态

算子状态的作用域是某个算子任务,这意味着所有在同一个并行任务之内的记录都能访问到相同的状态。算子状态不能通过其他任务访问,无论该任务是否来自相同算子。下图展示了任务访问算子状态的过程。

在这里插入图片描述
Flink 为算子状态提供了三类原语:

  • 列表状态list state):将状态表示为一个条目列表。
  • 联合列表状态union list state):同样是将状态表示为一个条目列表,但在进行故障恢复或从某个保存点启动应用时,状态的恢复方式和普通列表状态有所不同。
  • 广播状态broadcast state):专门为那些需要保证算子的每个任务状态都相同的场景而设计。这种相同的特性将有利于检查点保存或算子扩缩容。

2.键值分区状态

键值分区状态会按照算子输入记录所定义的键值来进行维护或访问。Flink 为每个键值都维护了一个状态实例,该实例总是位于那个处理对应键值记录的算子任务上。当任务在处理一个记录时,会自动把状态的访问范围限制为当前记录的键值。

因此所有键值相同的记录都能访问到一样的状态。下图展示了任务和键值分区状态的交互过程。

在这里插入图片描述
你可以把键值分区状态想象成一个在算子所有并行任务上进行分区(或分片)的键值映射。Flink 为键值分区状态提供了不同原语,它们的区别在于分布式键值映射中每个键所对应存储值的类型不同。我们接下来简要讨论一下键值分区状态最常用的几个原语。

  • 单值状态value state):每个键对应存储一个任意类型的值,该值也可以是某个复杂数据结构。
  • 列表状态list state):每个键对应存储一个值的列表。列表中的条目可以是任意类型。
  • 映射状态map state):每个键对应存储一个键值映射(map),该映射的键(key)和值(value)可以是任意类型。

通过这些状态原语,我们可以为 Flink 状态指定不同的结构,从而实现更加高效的状态访问。

3.状态后端

有状态算子的任务通常会对每一条到来的记录读写状态,因此高效的状态访问对于记录处理的低延迟而言至关重要。为了保证快速访问状态,每个并行任务都会把状态维护在本地。至于状态具体的存储。访问和维护,则是由一个名为 状态后端 的可插拔组件来决定。状态后端主要负责两件事:本地状态管理将状态以检查点的形式写入远程存储

对于本地状态管理,状态后端会存储所有键值分区状态,并保证能将状态访问范围正确地限制在当前键值。Flink 提供的一类状态后端会把键值分区状态作为对象,以内存数据结构的形式存在 JVM 堆中;另一类状态后端会把状态对象序列化后存到 RocksDB 中,RocksDB 负责将它们写到本地硬盘上。前者状态访问会更快一些,但会受到内存大小的限制;后者状态访问会慢一些,但允许状态变得很大。

由于 Flink 是一个分布式系统但只在本地维护状态,所以状态检查点就显得极其重要。而考虑到 TaskManager 进程以及它上面所有运行的任务都可能在任意时间出现故障,因此它们的存储只能看做是易失的。状态后端负责将任务状态以检查点形式写入远程持久化存储,该远程存储可能是一个分布式文件系统,也可能是某个数据库系统。不同的状态后端生成状态检查点的方式也存在一定差异。例如:RocksDB 状态后端支持增量检查点。这对于大规模的状态而言,会显著降低生成检查点的开销。

后续我们会详细讨论不同状态后端的区别以及它们各自的优劣。

4.有状态算子的扩缩容

流式应用的一项基本需求是 根据输入数据到达速率的变化调整算子并行度。对于无状态的算子,扩缩容很容易。但对于有状态算子,改变并行度就会复杂很多,因为我们需要把状态重新分组,分配到与之前数量不等的并行任务上。Flink 对不同类型的状态提供了四种扩缩容模式。

4.1 带有键值分区状态的算子

带有键值分区状态的算子 在扩缩容时会根据新的任务数量对键值重新分区。但为了降低状态在不同任务之间迁移的必要成本,Flink 不会对单独的键值实施再分配,而是会把所有键值分为不同的 键值组key group)。每个键值组都包含了部分键值,Flink 以此为单位把键值分配给不同任务。下图展示了键值分区状态通过键值组进行重新分区的过程。

在这里插入图片描述

4.2 带有算子列表状态的算子

带有算子列表状态的算子 在扩缩容时会对列表中的条目进行重新分配。理论上,所有并行算子任务的列表条目会被统一收集起来,随后均匀分配到更少或更多的任务之上。如果列表条目的数量小于算子新设置的并行度,部分任务在启动时的状态就可能为空。下图展示了算子列表状态的重分配过程。

在这里插入图片描述

4.3 带有算子联合列表状态的算子

带有算子联合列表状态的算子 会在扩缩容时把状态列表的全部条目广播到全部任务上。随后由任务自己决定哪些条且该保留,哪些该丢奔。下图展示了算子联合列表状态的重分配过程。

在这里插入图片描述

4.4 带有算子广播状态的算子

带有算子广播状态的算子 在扩缩容时会把状态拷贝到全部新任务上。这样做的原因是广播状态能确保所有任务的状态相同。在缩容的情况下,由于状态经过复制不会丢失,我们可以简单地停掉多出的任务。下图展示了算子广播状态的重分配过程。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【陈工笔记-Transformer】Transformer的基础认识

对Transformer生动形象的比喻 Transformer包括了Encoder和Decoder,在知乎上看到了对两个部分关系的一种理解,非常有趣。即,“一个人学习跳舞,Encoder是看别人是如何跳舞的,Decoder是将学习到的经验和记忆,…

被动信息搜集

被动信息搜集主要通过搜索引擎或者社交等方式对目标资产信息进行提取, 通常包括IP查询、Whois查询、子域名搜集等。进行被动信息搜集时不与目标产 生交互,可以在不接触到目标系统的情况下挖掘目标信息。主要方法包括:DNS 解析、子域名挖掘、…

Unity中创建Ultraleap 3Di交互项目

首先,创建新的场景 1、创建一个空物体,重命名为【XP Leap Provider Manager】,并在这个空物体上添加【XR Leap Provider Manager】 在物体XP Leap Provider Manager下,创建两个子物体Service Provider(XR)和Service Provider(…

随机点名--好玩哦

大屏滚动,随机点名,可刺激哦 想屏幕名字滚动得快一点,sleep时间就小一点 效果图 代码 #!/bin/bash namefile"/opt/name.txt" linenum$(sed -n $ $namefile) while : docleartmp$(sed -n "$[RANDOM%linenum1]p" $namefi…

文件上传之大文件分块上传

原则:合久必分,分久必合 优势部分:减少了内存占用,可实现断点续传,并发处理,利用带宽,提高效率 不足之处:增加复杂性,增加额外计算存储 应用场景:云存储大文件…

Springboot的 Lombok全部关联注解以及核心注解@Data详解

目录 工具安装 依赖注入 注解类别 1. Getter / Setter 2. ToString 3. EqualsAndHashCode 4. NoArgsConstructor / RequiredArgsConstructor / AllArgsConstructor 5. Data 示例 注意事项 6. Value 7. Builder 8. Slf4j / Log / Log4j / Log4j2 / XSlf4j 9. NonN…

03.领域驱动设计:了解实体和值对象以及它们的区别

目录 1、概述 2、实体 1.实体的业务形态 2.实体的代码形态 3.实体的运行形态 4.实体的数据库形态 3、值对象 1.值对象的业务形态 2.值对象的代码形态 3.值对象的运行形态 4.值对象的数据库形态 5.值对象的优势和局限 4、实体和值对象的区别 5、总结 1、概述 DDD战…

企业虚拟机服务器中了lockbit3.0勒索病毒怎么办,lockbit3.0勒索病毒解密处理流程

对于企业来说,企业的数据是企业的核心命脉,关乎着企业的生产与运营的所有工作。随着网络技术的不断发展,网络安全威胁也在不断增加。近期,云天数据恢复中心接到了很多企业的求助,企业的虚拟机服务器遭到了lockbit3.0勒…

vue的pinia环境搭建

一、 pinia是什么? Pinia是Vue的新一代轻量级状态管理库,它允许您跨组件/页面共享状态。Pinia由Vue.js官方成员重新设计,旨在提供更直观、更易于学习的状态管理解决方案。 Pinia的主要特点包括: 对Vue2和Vue3提供良好的支持&#…

机器学习之pandas库学习

这里写目录标题 pandas介绍pandas核心数据结构SeriesDataFrameDataFrame的创建列访问列添加列删除行访问行添加行删除数据修改 pandas介绍 pandas是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入 了大量库和一些标准的数据模型&#xff…

C#学习(十一)——Array和Collection

一、集合 集合重要且常用 孤立的数据是没有意义的,集合可以作为大量数据的处理,可进行数据的搜索、迭代、添加、删除。 C#中,所有集合都必须实现ICollection接口(数组Array除外) 集合说明Array数组,固定长…

【Linux】进程间通信概念 | 匿名管道

文章目录 一、什么是进程间通信进程间通信的概念进程间通信的目的进程间通信的分类进程间通信的本质 二、什么是管道三、匿名管道匿名管道的原理✨站在内核角度理解管道✨站在文件描述符角度理解管道 pipe系统调用fork后在父子进程间使用管道通信代码实现 匿名管道的读写规则管…

初识人工智能,一文读懂机器学习之逻辑回归知识文集(7)

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

CSS 双色拼接按钮效果

<template><view class="sss"><button> <!-- 按钮 --><view class="span"> 按钮 </view> <!-- 按钮文本 --></button></view></template><script></script><style>body {b…

uniapp微信小程序-input默认字的样式

需要的是这样的 问题 正常是在input框上面写样式就行&#xff0c;但是uniapp不起作用 解决 直接在input上写placeholder-style"color就解决了 <input class"findInput" type"text" placeholder"关键词查询"placeholder-style"co…

Gin 框架之jwt 介绍与基本使用

文章目录 一.JWT 介绍二.JWT认证与session认证的区别2.1 基于session认证流程图2.2 基于jwt认证流程图 三. JWT 的构成3.1 header : 头部3.2 payload : 负载3.2.1 标准中注册的声明 (建议但不强制使用)3.2.2 公共的声明3.2.3 私有的声明3.2.4 定义一个payload 3.3 signatrue : …

一文掌握SpringBoot注解之@Component 知识文集(5)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

操作系统(5)-----操作系统进程相关

目录 一.进程的组成 1.PCB&#xff08;进程控制块&#xff09; 2.程序段与数据段 二.进程的特征 三.进程的状态以及状态的转换 四.进程的组织 1.链接方式 2.索引方式 五.进程控制 六.进程控制相关原语 1.创建原语 2.撤销原语 3.阻塞原语 4.唤醒原语 5.切换原语 …

Spring MVC 请求流程

SpringMVC 请求流程 一、DispatcherServlet 是一个 Servlet二、Spring MVC 的完整请求流程 Spring MVC 框架是基于 Servlet 技术的。以请求为驱动&#xff0c;围绕 Servlet 设计的。Spring MVC 处理用户请求与访问一个 Servlet 是类似的&#xff0c;请求发送给 Servlet&#xf…

5G赋能智慧文旅:科技与文化的完美结合,打造无缝旅游体验,重塑旅游业的未来

一、5G技术&#xff1a;智慧文旅的强大引擎 5G技术的起源可以追溯到2010年&#xff0c;当时世界各国开始意识到4G技术已经达到了瓶颈&#xff0c;无法满足日益增长的移动通信需求。2013年&#xff0c;国际电信联盟&#xff08;ITU&#xff09;成立了5G技术研究组&#xff0c;开…