【大数据】Flink 架构(四):状态管理

这篇具有很好参考价值的文章主要介绍了【大数据】Flink 架构(四):状态管理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Flink 架构》系列(已完结),共包含以下 6 篇文章:

  • Flink 架构(一):系统架构
  • Flink 架构(二):数据传输
  • Flink 架构(三):事件时间处理
  • Flink 架构(四):状态管理
  • Flink 架构(五):检查点 Checkpoint(看完即懂)
  • Flink 架构(六):保存点 Savepoint

😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!

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

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

【大数据】Flink 架构(四):状态管理,# Flink,大数据,flink,实时计算,状态管理,状态后端
任务首先会接收一些输入数据。在处理这些数据的过程中,任务对其状态进行读取或更新,并根据状态和输入数据计算结果。我们以一个持续计算接收到多少条记录的简单任务为例。当任务收到一个新的记录后,首先会访问状态获取当前统计的记录数目,然后把数目增加并更新状态,最后将更新后的数目发送出去。

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

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

1.算子状态

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

【大数据】Flink 架构(四):状态管理,# Flink,大数据,flink,实时计算,状态管理,状态后端
Flink 为算子状态提供了三类原语:

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

2.键值分区状态

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

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

【大数据】Flink 架构(四):状态管理,# Flink,大数据,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 以此为单位把键值分配给不同任务。下图展示了键值分区状态通过键值组进行重新分区的过程。

【大数据】Flink 架构(四):状态管理,# Flink,大数据,flink,实时计算,状态管理,状态后端

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

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

【大数据】Flink 架构(四):状态管理,# Flink,大数据,flink,实时计算,状态管理,状态后端

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

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

【大数据】Flink 架构(四):状态管理,# Flink,大数据,flink,实时计算,状态管理,状态后端

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

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

【大数据】Flink 架构(四):状态管理,# Flink,大数据,flink,实时计算,状态管理,状态后端文章来源地址https://www.toymoban.com/news/detail-827998.html

到了这里,关于【大数据】Flink 架构(四):状态管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flink 2.0 状态管理存算分离架构演进与分离改造实践

    首先简单来说一下,flink2.0做存算分离,最最主要的一点是解决,大状态的问题,例如一个超过50T的物流数据,大状态恢复可能就要1天,所以才有存算分离这么一个设计初衷。 下面先来看一下 任务是怎么执行提交的,看一下state在整个流程里 处于一个什么位置 ) 像为了解决

    2024年02月22日
    浏览(28)
  • 大数据Flink实时计算技术

    1、架构 2、应用场景 Flink 功能强大,支持开发和运行多种不同种类的应用程序。它的主要特性包括:批流一体化、精密的状态管理、事件时间支持以及精确一次的状态一致性保障等。在启用高可用选项的情况下,它不存在单点失效问题。事实证明,Flink 已经可以扩展到数千核

    2024年02月10日
    浏览(43)
  • 数据架构的实时分析:Apache Flink 和 Apache Storm 的比较

    实时数据处理在大数据领域具有重要意义,它可以帮助企业更快地获取和分析数据,从而更快地做出决策。随着数据量的增加,传统的批处理方法已经不能满足企业的需求,因此需要使用实时数据处理技术。 Apache Flink 和 Apache Storm 是两个流行的实时数据处理框架,它们都可以

    2024年01月23日
    浏览(40)
  • Flink 状态后端

    状态后端 (state backend) : 负责管理本地状态的存储方式, 位置 Flink 的状态后端有两类 : 哈希表状态后端 (HashMapStateBackend) : 状态放在内存 内嵌 RocksDB 状态后端 (EmbeddedRocksDBStateBackend) : 状态放在 RocksDB 数据库 哈希表状态后端 : 实现 : 将状态当作对象 (objects) , 保存在 Taskmanager 的

    2024年02月13日
    浏览(33)
  • 流批一体计算引擎-4-[Flink]消费kafka实时数据

    Python3.6.9 Flink 1.15.2消费Kafaka Topic PyFlink基础应用之kafka 通过PyFlink作业处理Kafka数据 PyFlink需要特定的Python版本,Python 3.6, 3.7, 3.8 or 3.9。 1.3.1 python3和pip3的配置 一、系统中安装了多个版本的python3 。 二、环境变量path作用顺序 三、安装Pyflink 1.3.2 配置Flink Kafka连接 (1)在https://mvnr

    2024年02月06日
    浏览(30)
  • Flink State backend状态后端

    Flink在v1.12到v1.14的改进当中,其状态后端也发生了变化。老版本的状态后端有三个,分别是MemoryStateBackend、FsStateBackend、RocksDBStateBackend,在flink1.14中,这些状态已经被废弃了,新版本的状态后端是 HashMapStateBackend、EmbeddedRocksDBStateBackend。 有状态流应用中的检查点(checkpoint),

    2024年01月25日
    浏览(32)
  • 209.Flink(四):状态,按键分区,算子状态,状态后端。容错机制,检查点,保存点。状态一致性。flink与kafka整合

    算子任务可以分为有状态、无状态两种。 无状态:filter,map这种,每次都是独立事件 有状态:sum这种,每次处理数据需要额外一个状态值来辅助。这个额外的值就叫“状态” (1)托管状态(Managed State)和原始状态(Raw State) 托管状态 就是由Flink统一管理的,状态的存储访问

    2024年02月06日
    浏览(36)
  • Flink理论—容错之状态后端(State Backends)

    Flink 使用流重放 和 检查点 的组合来实现容错。检查点标记每个输入流中的特定点以及每个运算符的相应状态。通过恢复运算符的状态并从检查点点重放记录,可以从检查点恢复流数据流,同时保持一致性 容错机制不断地绘制分布式流数据流的快照。对于小状态的流式应用程

    2024年02月20日
    浏览(28)
  • 大数据职业技能大赛样题(数据采集与实时计算:使用Flink处理Kafka中的数据)

           编写Scala代码,使用Flink消费Kafka中Topic为order的数据并进行相应的数据统计计算(订单信息对应表结构order_info,订单详细信息对应表结构order_detail(来源类型和来源编号这两个字段不考虑,所以在实时数据中不会出现),同时计算中使用order_info或order_detail表中create_ti

    2024年03月24日
    浏览(44)
  • OceanBase X Flink 基于原生分布式数据库构建实时计算解决方案

    摘要:本文整理自 OceanBase 架构师周跃跃,在 Flink Forward Asia 2022 实时湖仓专场的分享。本篇内容主要分为四个部分: 分布式数据库 OceanBase 关键技术解读 生态对接以及典型应用场景 OceanBase X Flink 在游戏行业实践 未来展望 点击查看原文视频 演讲PPT 作为一款历经 12 年的纯自研

    2024年02月13日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包