【大数据】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/354281.html

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

相关文章

做成任何事情的方法

怎么样把一件事情做成功呢? 传统的方法可能会告诉你:你首先要有一个目标,目标要明确,可量化,要遵循 SMART 原则;然后再把目标拆成一个个小目标,先实现一个小目标,再实现一个小目标&a…

研发日记,Matlab/Simulink避坑指南(八)——else if分支结构Bug

文章目录 前言 背景介绍 问题描述 分析排查 解决方案 总结归纳 前言 见《研发日记,Matlab/Simulink避坑指南(三)——向上取整Bug》 见《研发日记,Matlab/Simulink避坑指南(四)——transpose()转置函数Bug》 见《研发日记,Matlab/Simuli…

Java强训day7(选择题编程题)

选择题 public class Test01{private static int x 100;public static void main(String[] args) {Test01 hs1 new Test01();hs1.x;Test01 hs2 new Test01();hs2.x;hs1new Test01();hs1.x;Test01.x--;System.out.println("x"x);} }public class Test01{private …

高级IO之epoll模型

一、epoll模型介绍 epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,用于监视一个或多个文件描述符,以查看它们是否可以进行读取、写入或异常处理。它能够显著提高程序在大量并发连接…

C语言系列-浮点数在内存中的存储

🌈个人主页: 会编程的果子君 ​💫个人格言:“成为自己未来的主人~” 目录 浮点数在内存中的存储 浮点数的存储 浮点数存的过程 浮点数取的过程 题目解析 浮点数在内存中的存储 常见的浮点数:3.14159.1E10等,浮点数家族包括&…

微信开发者工具 git 拉取 failed invalid authentication scheme

微信开发者工具 git 拉取 failed invalid authentication scheme 拉取代码时报错,无效身份认证 解决方案: 1.检查git地址是否正常 2.检查git用户名密码是否正确

【Vue2 + ElementUI】更改el-select的自带的下拉图标为倒三角,并设置相关文字颜色和大小

效果图 实现 <template><div class"search_resources"><div class"search-content"><el-select class"search-select" v-model"query.channel" placeholder"请选择" change"handleResource&q…

【Matlab】音频信号分析及FIR滤波处理——凯泽(Kaiser)窗

一、前言 1.1 课题内容: 利用麦克风采集语音信号(人的声音、或乐器声乐),人为加上环境噪声(窄带)分析上述声音信号的频谱,比较两种情况下的差异根据信号的频谱分布,选取合适的滤波器指标(频率指标、衰减指标),设计对应的 FIR 滤波器实现数字滤波,将滤波前、后的声音…

258:vue+openlayers加载mapbox-style的地图

第258个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中添加mapbox地图,跟之前的不同处理方式是,这里采用了ol-mapbox-style插件来加载mapbox地图。具体请参考源代码和API。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示…

基于Micropython利用ESP32-C3墨水屏电子时钟方法

本篇笔记介绍一下我们设计制作的墨水屏时钟。 1、所需硬件 1&#xff09;合宙的ESP32-C3&#xff1a; 2&#xff09;电子价签拆出来的2.9寸墨水屏&#xff1a; ——电子价签型号为&#xff1a;Stellar-L&#xff0c;墨水屏型号为&#xff1a;E029A01。 3&#xff09;自己设计…

Linux-ROS学习之旅(一)

##本人使用的是双系统&#xff0c;noetic版本&#xff0c;学习ROS初衷是学习控制机械臂&#xff0c;具体下载方法见B站&#xff0c;观看的教程是古月居早年的教学视频&#xff0c;和ROS_wiki&#xff1a;ROS/Tutorials - ROS Wiki ##下一篇文章有具体的实例&#xff0c;但是所用…

OJ_阶乘的和

题干 c语言实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<vector> #include<set> using namespace std;int main() {vector<int> factorialArr;//把0&#xff01;放入数组factorialArr.push_back(1);int curFactorial 1;for (in…

《合成孔径雷达成像算法与实现》Figure5.16

clc clear close all距离向参数 R_eta_c 20e3; % 景中心斜距 Tr 25e-6; % 发射脉冲时宽 Kr 0.25e12; % 距离向调频率 Fr 7.5e6; % 距离向采样率 Nrg 256; % 距离线采样点数 Bw abs(Kr*Tr); …

uniapp,页面当有按钮的时候,可以做一个动态的效果

效果&#xff1a; 这个是当点着按钮的时候没有松开按钮的效果&#xff08;没有阴影&#xff09; 这个是当松开按钮的效果&#xff08;有阴影&#xff09; 原理讲解&#xff1a; 这段代码实现的业务逻辑是在一个Vue组件中控制“现金”按钮的阴影效果。具体来说&#xff0c;它通…

系统架构17 - 软件工程(5)

软件工程 软件测试测试原则测试方法静态测试动态测试黑盒测试白盒测试灰盒测试自动化测试 测试阶段单元测试集成测试系统测试性能测试验收测试其它测试AB测试Web测试链接测试表单测试 测试用例设计黑盒测试用例白盒测试用例 系统维护遗留系统系统转换转换方式数据转换与迁移 评…

C++力扣题目416--分割等和子集 1049--最后一块石头的重量II

416. 分割等和子集 力扣题目链接(opens new window) 题目难易&#xff1a;中等 给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200 示例 1: 输入: […

openssl3.2 - 测试程序的学习 - test\aesgcmtest.c

文章目录 openssl3.2 - 测试程序的学习 - test\aesgcmtest.c概述笔记能学到的流程性内容END openssl3.2 - 测试程序的学习 - test\aesgcmtest.c 概述 openssl3.2 - 测试程序的学习 aesgcmtest.c 工程搭建时, 发现没有提供 test_get_options(), cleanup_tests(), 需要自己补上…

数据结构与算法:复杂度

友友们大家好啊&#xff0c;今天开始正式学习数据结构与算法有关内容&#xff0c;后续不断更新数据结构有关知识内容&#xff0c;希望多多支持&#xff01; 数据结构&#xff1a; 数据结构是用于存储和组织数据的方式&#xff0c;以便可以有效地访问和修改数据。不同的数据结构…

翻译: GPT-4 Vision从图像转换为完全可编辑的表格 升级Streamlit四

GPT-4 Vision 系列: 翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式一翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式二翻译: GPT-4 Vision静态图表转换为动态数据可视化 升级Streamlit 三 当您需要从不可复制或不可下载的表中提取数据时&#x…

Java+Spring Cloud +Vue+UniApp微服务智慧工地云平台源码

目录 智慧工地云平台功能 【劳务工种】所属工种有哪些&#xff1f; 1.管理人员 2.信息采集 3.证件管理 4.考勤管理 5.考勤明细 6.工资管理 7.现场统计 8.WIFI教育 9.课程库管理 10.工种管理 11.分包商管理 12.班组管理 13.项目管理 智慧工地管理平台是以物联网、…