Flink详解之七--状态管理

【FLINK】Flink 状态后端学习及如何选择合适的StateBackends 背景:其实关于flink statebackend的这篇文章我犹豫了很久要不要写,因为我觉得官网上面解释的就很详细了,最终还是落笔写下这篇文章最重要的原因是总结提取一下重要的内容给自己也给刚接触的同学吧 ... 阅读详情

一、概念

实时处理中的很多操作都是一次对单个事件做处理,也有一些操作需要历史事件的信息,这些操作被称为有状态的。也就是说,所谓的状态就是由历史事件处理供后续操作使用的信息。

二、用途

状态是的使用场景有很多,主要有以下几种:

  • 窗口计算 比如天/小时/分钟窗口计算,需要保存窗口内计算所需的每个事件的信息或累积信息。
  • 机器学习 可以使用状态保存当天版本模型参数信息。
  • 历史数据对比 需要记录历史上某一段时间的数据。
  • 数据恢复 主要用于Flink的容错机制。

三、分类

3.1 keyed state vs operator state

根据是否处理keyed stream,可以将状态分为两类keyed state和operator state。

3.1.1 keyed state

这类状态仅可在 KeyedStream 上使用,可以通过 stream.keyBy(...) 得到 KeyedStream。每个key对应一个state, 一个算子实例会处理多个key, 可以访问多个state。算子实例并发改变时,state会随着key在实例间迁移。所有keyed state都可以设置有效期,所有状态都支持单元素有效期设置,过期的状态会被清除。

keyed state是最常用的一类状态,主要类型包括

  • ValueState<T> 保存一个可以更新和检索的值。
  • ListState<T> 保存一个元素的列表,可追加,可检索。
  • MapState<UK, UV> 维护了一个映射列表。
  • ReducingState<T> 所有状态聚合为一个单值,输入和输出数据类型一致。
  • AggregatingState<IN, OUT> 所有状态聚合为一个单值,输入和输出数据类型可以不一致。

以ValueState<T>为例:

public class TestState extends RichFlatMapFunction<Integer, Integer> {

    private transient ValueState<Integer> sum;

    @Override
    public void open(Configuration parameters) throws Exception {
        ValueStateDescriptor<Integer> state = new ValueStateDescriptor<>("state", Integer.class);
        sum = getRuntimeContext().getState(state);
    }

    @Override
    public void flatMap(Integer input, Collector<Integer> out) throws Exception {
        sum.update(sum.value()+input);
    }
}

3.1.2 operater state

Operator State也叫non-keyed state,每个算子状态都绑定一个并行算子实例。Kafka连接器是在Flink中使用算子状态的一个很好的例子。Kafka consumer的每个并行实例都维护主题分区和偏移量的映射作为其算子状态。

当并发发生变化时,Operator State接口支持在并行算子实例之间重新分配状态。进行这种再分配有多种方式可选。

3.2 managed state vs raw state

根据状态是否有Flink运行时托管,将状态分为managed state和raw state。

Managed State由Flink运行时控制的数据结构表示,如内部哈希表或RocksDB。例如ValueState、ListState等,Flink的运行时对状态进行编码并将它们写入checkpoints。

Raw State是算子保存在自定义数据结构中的状态。checkpoint时,只向检查点写入一个字节序列。Flink不关注数据结构,只看原始字节。

所有数据流函数都可以使用managed state, 但是raw state接口只能在实现operators后才能使用。开发中除非必要,否则推荐使用managed state。因为对于managed state, 当并行度改变时,Flink会自动重新分配状态,也可以更好的进行内存管理。

四、存储方式

flink内部状态的存储,取决于state backend的选择,目前有3种内置的state backend可供使用:MemoryStateBackend, FsStateBackend, RocksDBStateBackend。我们可以在配置文件 flink-conf.yaml 中配置所有Flink作业的默认StateBackend,也可以在作业中设置StateBackend,这样会覆盖默认值。

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStateBackend(...);

4.1 MemoryStateBackend

当用户没有设置时,默认使用MemoryStateBackend。运行时将状态保存在TaskManager堆内存中,CheckPoint时,状态快照会发往JobManager, 并存储在JobManager的堆内存中。为防止数据流阻塞,这个状态快照尽量配置成异步快照,默认也是异步的,除非构建时手动将异步参数置成false。

new MemoryStateBackend(MAX_MEM_STATE_SIZE, false);

MemoryStateBackend的一些限制:

  • 独立状态默认最大为5M,上限(MAX_MEM_STATE_SIZE)可调。
  • MAX_MEM_STATE_SIZE最大不能超过akka frame大小
  • 所有状态聚合后,要放在JobManager的内存里,所以最大不能超过JobManager的内存。

由于存储空间的限制,以及当作业重启时状态会丢失,所以,MemoryStateBackend更适合本地开发与调试,或者状态较小并且作业重启时对状态丢失不敏感的场景,不太适合普遍意义上的生产场景中使用。

4.2 FsStateBackend

FsStateBackend将运行时状态保存在TaskManager内存中,CheckPoint时,会将状态快照保存在指定的文件系统目录中,只会将少量元数据保存在JobManager,而高可用模式下,会将元数据保存在CheckPoint元数据文件中。状态快照默认也是异步的,除非构建时手动将异步参数置成false。

new FsStateBackend(path, false); //path为文件系统路径

状态大小只受限于TaskManager的内存,适用于窗口比较大,状态比较大的场景,支持高可用,适合在生产环境中使用。

4.3 RocksDBStateBackend

RocksDBStateBackend将运行时状态保存在RocksDB数据库中,RocksDB默认将文件存储在TaskManager文件目录中,checkpoint 时,整个 RocksDB 数据库被 checkpoint 到配置的文件系统目录中,支持增量checkpoint。只支持异步快照。

RocksDBStateBackend的一些限制:

  • RocksDB支持Key和Value最大分别为2G
  • 运行时状态存入RocksDB,读写都需要序列化和反序列化,比写入内存效率低,状态较大时,也影响吞吐量。

由于保存的状态只受磁盘大小限制,可以支持比FsStateBackend更大的状态场景。

详解 Flink 的状态管理 无状态的流处理:根据每一次当前输入的数据直接转换输出结果的过程,在处理中只需要观察每个输入的独立事件。例如, 将一个字符串类型的数据拆分开作为元组输出或将每个输入的数值加 1 后输出。Flink 中的基本转换算子 (map、filter、flatMap 等) 在计算时不依赖其他数据,所以都属于无状态的算子。有状态的流处理:根据每一次当前输入的数据和一些其他已处理的数据共同转换输出结果的过程,这些其他已处理的数据就称之为状态(state),状态由任务维护,可以被任务的业务逻辑访问。 阅读详情

相关推荐

详解Flink中的状态管理

      流式计算分为无状态和有状态两种情况。无状态的计算观察每个独立事件,并根据最后一个事件输出结果。例如:流处理应用程序从传感器接收温度读书,并在温度超过90度时发出警告。有状态的计算则会基于多个事件输出结果。例子如下:       ①所有类型的窗口。例如:计算过去一小时的平均温度,就是有状态的计算。       ②所有用于

huahuaxiaoshao的博客 2321

【Flink】状态管理

根据当前的输入可以直接转换得到输出结果,这种鼻子就是无状态算子,如map,flatMap,filter。

lxtx 3432

flink on yarn、资源及状态管理

flink源码学习: http://www.cnblogs.com/bethunebtj/p/9168274.html flink on yarn 执行任务的两种方式 1.yarn-session.sh(开辟资源)+flink run(提交任务) 1.在yarn中起一个守护进程,用于启动多个job,即一个application master 管理多个job 2.启动命令: ./yarn...

mapeng765441650的博客 5649

Flink(四) 状态管理 1

一、状态是什么? 1.1有状态和无状态: Flink不是要做流处理嘛。那当一个数据流过来的时候,第一个数据首先会被flink中的算子执行,执行完成 后会生成一个执行结果 这个执行后的结果,例如是输出一下,后续再过来的数据,例如第二个数据的计算就和第一个数据的计算毫无关系了,这就是无状态 这个执行后的记过。例如是需要做求和的计算,后续再过来的数据例如,的第二个数据的计算需要依赖与第一次计算的结果,这就是有状态的计算 1.2.Flink中的有状态流计算 1.2.1 flink中主要使用它的有状态计算 我们

又小雨的博客 1399

Flink状态管理详解:大数据处理中的关键机制

如何正确理解和使用状态管理?我们将覆盖状态的定义、有状态计算的价值、Flink保证状态一致性的机制(Checkpoint)、状态存储的选择(StateBackend),并通过实战案例展示状态管理的具体操作。范围限定在Flink 1.17及以上版本的核心状态机制,不涉及高级特性(如Savepoint、状态迁移)。核心概念与联系:用奶茶店例子解释状态、Checkpoint、StateBackend;核心原理:揭秘Flink如何用分布式快照(Checkpoint)保证状态一致性;实战案例。

2501_92132293的博客 1098

Flink State状态管理原理与代码实例讲解

《Flink State状态管理原理与代码实例讲解》 关键词:Flink、State、状态管理、流处理、批处理、代码实例 摘要:本文将深入探讨Flink中的State状

AI天才研究院 1362

Flink中state使用揭秘

在flink中,state是其重要的特性之一。有了state使得在数据流上进行状态的计算成为了可能,为flink的发展做出了重要贡献。没有state时需要在flink上进行状态的计算将会非常复杂且在复杂场景下无法实现,如集群宕机时状态快照的保存。

4471

VASP+机器学习快速收敛AIMD

本文介绍了如何利用VASP结合机器学习技术快速收敛AIMD(从头算分子动力学)模拟。首先,通过训练机器学习力场,生成关键文件如ML_ABN(包含结构数据集)、ML_FFN(存储回归结果)和ML_LOGFILE(记录训练日志)。接着,配置INCAR文件以设置计算参数,包括并行化、分子动力学和机器学习相关参数。KPOINTS文件用于定义K点网格。计算完成后,备份CONTCAR文件作为后续模拟的初始结构。最后,利用训练好的力场文件进行纯机器学习力场分子动力学模拟,并提交任务执行。

qq_44812865的博客 1405

详解 Flink 状态管理

文章目录1.前言2.状态是什么东西?有了状态能做什么?3.为什么离线计算中不提状态,实时计算老是提到状态这个概念?状态到底在实时计算中解决了什么问题?3.1 离线任务真的是没有状态、状态管理这些个概念这个概念嘛?3.2 实时任务真的只能依赖状态、状态管理嘛?4.有了状态、为什么又出现了状态管理的概念?5.怎么学习 Flink 中的状态、状态管理相关的概念呢?6.Flink 中状态的分类?7.Flink 中状态的使用方式?8.Flink 状态后端的分类及使用建议?9.Flink 中状态的能力扩展 - TTL?

qq_24095055的博客 1818

TMS320F28388D 学习笔记2 高精度PWM (HRPWM)

HRPWM的学习记录。

whyorwhnt的专栏 9534

FFmpeg魔改指南:让RTMP协议完美兼容H265的三种方法(含SRS适配技巧)

本文详细介绍了三种让RTMP协议兼容H265编码的FFmpeg魔改方案,包括基于官方补丁的标准改造、Intel的SVT-HEVC集成方案以及金山云的自定义扩展方案。文章重点解析了各方案的实现原理与适配技巧,并提供了在SRS 6.0服务器上进行深度配置和性能调优的完整实战指南,帮助开发者解决H265推流至传统RTMP服务器的兼容性问题。

weixin_29290947的博客 194

Flink 状态管理详解(超全收藏)

Flink 状态管理详解(超全收藏)

ytp552200ytp的博客 6393

ESP32 Arduino学习篇 (一) 引脚和串口的基本使用

简单来讲arduino就是通过源代码控制开发板的信号输入输出从而实现对一些电子元件的控制,例如LED灯,蜂鸣器,按键arduino程序首先来讲arduino程序是基于C语言,而实现类似对于LED灯和蜂鸣器的简单控制只需简单C语言知识即可实现。arduino程序是基于函数的,而在arduino的库有很多函数,我们只需要调用即可。arduino的程序主体是**setup()函数和loop()**函数以及其它在使用过程中需要构建的函数:setup()函数。

DOF526570的博客 1万+

Flink 状态管理的底层逻辑

在流处理中,状态是指任务在处理数据流时所维护的中间数据。这些数据可能包括计数器、聚合结果、窗口状态等。状态管理的核心目标是确保数据的一致性和可靠性,即使在节点故障或网络中断的情况下也能保持数据的完整性。Flink 的状态管理机制是其高性能和高可靠性的基石。通过灵活的 State Backend 和强大的 Checkpointing 功能,Flink 能够在复杂的流处理环境中提供稳定的支持。对于开发者而言,理解状态管理的底层逻辑不仅有助于优化应用性能,还能提高系统的健壮性。

2501_90726410的博客 1739

机器学习模型——非线性回归

升维是一种常用的处理非线性问题的方法,它通过将原始数据从低维空间映射到高维空间来增强模型的表达能力。我们可以看出,二维数据用一维直线很难去很好的拟合。升维里的degree设置的不易过大,否则容易造成维度灾难。升维后,拟合的线与原数据比较符合。将非线性问题转换为线性问题。

qq_60688380的博客 1421

杰理JL703N的SDK内部MIDI 音色库功能使用教程

本文介绍了MIDI琴按键解码和MIDI文件解码的实现方法。MIDI琴解码通过audio_dec_midi_ctrl.c文件实现,MIDI文件(mfa格式)解码则使用audio_dec_midi_file.c。使用前需将音色文件存放在SD卡或内置flash中(需确保四字节对齐),并在download.c中配置路径。同时需在板级配置中将FLASH设置为16Mbit以解决编译问题。关键注意事项包括音色文件的文件夹结构对齐要求和MIDI数据流的正确配置。

qq_42014563的博客 390

【Flink】Flink 状态管理

文章目录一、前言二、状态类型2.1、Keyed State2.2、Operator State三、状态横向扩展四、检查点机制4.1、开启检查点4.2、保存点机制五、状态后端5.1、状态管理器分类MemoryStateBackendFsStateBackendRocksDBStateBackend5.2、配置方式六、状态一致性6.1、端到端(end-to-end)6.2、Flink+Kafka 实现端到端的 exactly-once语义七、链接文档 一、前言 有状态的计算是流处理框架要实现的重要功能,因为稍复

w1992wishes的博客 1139

基于ESP32的智能无线广播系统开发博客

通过本项目的开发,我们成功地实现了基于ESP32的智能无线广播系统。该系统不仅具备传统广播的功能,还实现了通过Wi-Fi无线传输音频、实时广播和智能控制等多种先进功能。未来,随着技术的进一步发展,我们还可以扩展更多功能,如智能推荐广播内容、支持语音识别和控制等。希望本项目能够为嵌入式开发人员提供一些思路和参考,帮助大家在实际开发中更好地应用ESP32平台,开发出更加智能和实用的无线广播系统。

2201_76125393的博客 423

3w 字详解 Flink 状态管理!(建议收藏)

记得点击"大数据羊说",设为星标⭐后台回复【加群】,申请加入优质大数据学习社群1.前言大家好,我是老羊。该文耗时将近 3 个月总结。集博主心得理解之大成。不多说了,本文从盘古开天辟地(状态是啥?)开始说 Flink State。如下为本文目录,诚意满满。⭐ 状态是什么东西?有了状态能做什么?⭐ 为什么离线计算中不提状态,实时计算老是提到状态这个概念?状态到底在实时计算...

数据一哥,公众号:数据社 6034

LAMMPS-使用MATLAB计算径向分布函数

首先需要使用LAMMPS进行分子动力学模拟,并获取到所需的数据文件,LAMMPS是一款开源的分子动力学模拟软件,可以模拟原子、分子和离子的运动行为,对于本文的目标假设你已经完成了LAMMPS的安装和模拟过程,获得了数据文件。)是一种重要的统计工具,用于描述原子或分子之间的空间分布情况,通过计算RDF可以获得物质的结构信息、相互作用距离以及相位转变等重要参数,本文将介绍如何使用MATLAB计算LAMMPS生成的数据文件的径向分布函数。变量替换为你的实际数据文件的名称。

weixin_50547796的博客 514

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

七、Flink入门--状态管理

流式作业的特点时7*24小时运行,数据不重复消费,不丢失,保证只计算一次,数据实时产出不延迟,但是当状态很大,内存容量限制,或者实例运行奔溃,或需要扩展并发度等情况下,如何保证状态正确的管理,在任务重新执行的时候能正确执行,状态管理就显得尤为重要。

大数据之路 1544

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

[官方Flink入门笔记 ] 七、状态管理及容错机制

一 .前言 1.1. 什么是状态 首先举一个无状态计算的例子:消费延迟计算。 假设现在有一个消息队列,消息队列中有一个生产者持续往消费队列写入消息,多个消费者分别从消息队列中读取消息。从图上可以看出,生产者已经写入 16 条消息,Offset 停留在 15 ;有 3 个消费者,有的消费快,而有的消费慢。消费快的已经消费了 13 条数据,消费者慢的才消费了 7、8 条数据。 如何实时统计每个消费者落后多少条数据,如图给出了输入输出的示例。可以了解到输入的时间点有一个时间戳,生产者将消息写到了某个时间点的位置

张伯毅的专栏 819

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Flink原理与实现:详解Flink中的状态管理

【本文转自Flink原理与实现:详解Flink中的状态管理】Flink原理与实现系列文章 :Flink 原理与实现:架构和拓扑概览Flink 原理与实现:如何生成 StreamGraphFlink 原理与实现:如何生成 JobGraphFlink原理与实现:如何生成ExecutionGraph及物理执行图Flink原理与实现:Operator Chain原理上面Flink原理与实现的文章中,有引用...

xorxos的专栏 2万+

再忙也需要看的Flink状态管理

Flink状态管理 上几篇我们讲完了Flink窗口的相关内容,那么问题来了,我们如果在一个开窗的流处理上做求和操作,突然处理凉了,怎么办呢?那我们需要去重新计算吗?所以接下来也就需要去介绍我们的Flink状态管理了。 一、 简介 流式计算其实分为无状态和有状态两种情况。无状态的计算观察每个独立事件,并根据最后一个事件输出结果。例如,流处理应用程序从传感器接收温度读数,并在温度超过90度时发出警告。有状态的计算则会基于多个事件输出结果。那么究竟哪些是有状态的呢?如下: 所有类型的窗口。例如,计算过去一小时的

叁木大数据 1488

Flink之状态管理

Flink中的状态管理是指在流处理任务中对数据的状态进行有效管理和维护的过程。状态管理是非常重要的,因为它允许我们在流式处理中维护和操作数据的状态信息,以实现复杂的计算逻辑和应用需求。

积跬步,至千里。 2123
上一篇: Flink详解系列之八--Checkpoint和Savepoint
下一篇: Flink详解系列之六--窗口机制
wrr-cat
博客等级 码龄9年 128粉丝 302原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值