首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Flink State 状态原理解析

Flink State 状态原理解析

原创
作者头像
吴云涛
修改于 2024-03-12 00:49:32
修改于 2024-03-12 00:49:32
54100
代码可运行
举报
文章被收录于专栏:Flink 实践Flink 实践
运行总次数:0
代码可运行

一、Flink State 概念

State 用于记录 Flink 应用在运行过程中,算子的中间计算结果或者元数据信息。运行中的 Flink 应用如果需要上次计算结果进行处理的,则需要使用状态存储中间计算结果。如 Join、窗口聚合场景。

Flink 应用运行中会保存状态信息到 State 对象实例中,State 对象实例通过 StateBackend 实现将相关数据存储到 FS 文件系统或者 RocksDB 数据库中。在Flink应用运行过程中,通过 checkpoint 快照定期地保存状态数据。并在 Flink 应用重启时加载checkpoint/savepoint 来实现状态的恢复,从而让 Flink 应用继续完成之前的数据计算,实现数据精确一次向下游传递。

1.1 Apache Flink 中 State 的存储实现 StateBackend 分类

分为以下3类:

  • 基于内存的 HeapStateBackend。状态存储在内存中。
  • 基于 HDFS 或 OSS 的 FsStateBackend。状态存储在内存,并在做 cp(checkpoint)时存到远端。
  • 基于 RocksDB 的 RocksDBStateBackend。将对象序列化成二进制存在内存和本地磁盘的 RocksDB 数据中,并在 cp 时存到远端。

HeapStateBackend 和 RocksDBStateBackend 分别对应在 TaskManager 内存模型中的位置:

RocksDBStateBackend 中存储结构:

namespace: 在不同的 namespace 下存在相同名称的状态。

1.1.1 State 状态持久化

通过 Chandy-Lamport 分布式快照算法进行 checkpoint 完成状态数据的持久化。然后在 Flink 应用重启时读取 State 状态数据,进行运行现场的还原。

chekcpoint 分类:

  • 基于内存的全量 checkpoint
  • HDFS 全量 checkpoint
  • RocksDB 全量 checkpoint/增量 checkpoint

1.2 State 基于算子和数据分组的分类

State 可分为 Operator State 和 Keyed State 两类。

  • Operator State(称为 non-keyed state)

常常存在于Source, Sink中。具体实现类例如:BroadcastState

例:Kafka Source 中用 OperatorState 记录 offset。

  • Keyed State

任何类型的 keyed state 都可以有有效期(TTL),所有状态类型都支持单元素的 TTL。 这意味着 List 元素和 Map 映射元素将独立到期。

例:SQL GroupBy/PartitionBy 后的窗口中的数据,每个 key 都有对应的 State。key 与 key 之间的 State 数据不可见。

keyed state 的具体实现类:

  • ValueState
  • MapState
  • ListState
  • AggregatingState
  • ReducingState
  • 。。。。。

Flink State思维导图:

Keyed State

Operator State

适用算子类型

只适用于KeyedStream上的算子

可用于所有算子

状态分配

每个Key对应一个状态

一个算子子任务对应一个状态

横向扩展

状态随着keyBy的分组KeyGroup自动在多个算子子任务上迁移

有多种状态重新分配的方式

创建和访问方式

自定义算子(重写RichFunction,通过State 名称从 getRuntimeContext方法创建或获得 State )

实现 CheckpointedFunction 等接口

支持数据结构

ValueState、ListState、MapState等

ListState、BroadcastState等

二、常见状态相关处理流程

2.1 Flink 应用中状态是如何存储的?

  1. Kafka Source 如何存储 OperatorState?
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class FlinkKafkaConsumerBase {
 private transient ListState<Tuple2<KafkaTopicPartition, Long>> unionOffsetStates; // state名称:"topic-partition-offset-states"
// 特殊的State类型:Union State 
}

unionOffsetStates这个变量就是 OperatorState类型的。

  1. Map算子如何存储需要累计的数据?

• ValueState/MapState/ListState/......

思考:keyby 后的数据分发与多并行度 subtask 之间的关系是怎样的?

首先,datastream 中数据经过 keyby 之后,会划分到各个 KeyedStream 中。每个 KeyedStream 有自己的 KeyedState(如ValueState/ListState/MapState)。

其次,KeyedStream 中的数据会以 KeyGroup 方式组织在一起。KeyGroup 是 Flink 重新分发 key state 的最小单元。

最后,KeyGroup 中的数据会通过取模最大并行度的方式分散到各个 subtask 中。以下是关键源码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
KeyGroupStreamPartitioner#selectChannel(record)
{
    K key;
    key = keySelector.getKey(record.getInstance().getValue());
    return KeyGroupRangeAssignment.assignKeyToParallelOperator(
            key, maxParallelism, numberOfChannels);
}
--KeyGroupRangeAssignment#assignKeyToParallelOperator()
    {
    return computeOperatorIndexForKeyGroup(maxParallelism, parallelism, assignToKeyGroup(key, maxParallelism));
    }
    --KeyGroupRangeAssignment#computeOperatorIndexForKeyGroup()
      公式:OperatorIndex = keyGroupId * parallelism / maxParallelism
    --KeyGroupRangeAssignment#assignToKeyGroup()
      {
        return computeKeyGroupForKeyHash(key.hashCode(), maxParallelism);
       }

2.2 修改并行度场景时 State 状态存储的变化

2.3 State 与 Checkpoint 关系

分布式快照 Checkpoint 的概念,定期将 State 持久化到 外部存储系统(HDFS/OSS) 上。用户可以通过实现 CheckpointedFunction 接口来使用 operator state。通过 barrier 来对齐 checkpoint,等待 State 持久化完成(此过程参数不同也可能是异步的)。

常见 State 与 CP 相关的问题

  • State 状态过大。现象为多个算子或单个算子多个 subtask 做 checkpoint 慢,可导致 CP 对齐时间长,严重时会导致 CP 超时。
  • 数据倾斜导致某个 subtask 处理不及时。现象为单个算子少数几个 subtask 做 checkpoint 慢,导致 CP 对齐时间长。严重时会导致 CP 超时。
  • 大作业(并行度搞)频繁做 CP,会频繁上传小文件,导致 HDFS 集群小文件过多。

常用解决措施:调大托管内存大小。

三、参考文档:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
手把手教你使用CNN进行交通标志识别(已开源)
在本文中,使用Python编程语言和库Keras和OpenCV建立CNN模型,成功地对交通标志分类器进行分类,准确率达96%。开发了一款交通标志识别应用程序,该应用程序具有图片识别和网络摄像头实时识别两种工作方式。
小白学视觉
2022/12/28
3.4K0
手把手教你使用CNN进行交通标志识别(已开源)
如何使用900万张开放图像训练600类图片分类器
如果你正在尝试构建一个图片分类器,但是需要训练集,你最好的选择是查看 Google Open Images 。
AI研习社
2019/07/15
1.1K0
如何使用900万张开放图像训练600类图片分类器
手把手搭建一个【卷积神经网络】
本文介绍卷积神经网络的入门案例,通过搭建和训练一个模型,来对10种常见的物体进行识别分类;使用到CIFAR10数据集,它包含10 类,即:“飞机”,“汽车”,“鸟”,“猫”,“鹿”, “狗”,“青蛙”,“马”,“船”,“卡车” ;共 60000 张彩色图片;通过搭建和训练卷积神经网络模型,对图像进行分类,能识别出图像是“汽车”,或“鸟”,还是其它。
一颗小树x
2021/05/12
1.5K0
手把手搭建一个【卷积神经网络】
自动驾驶汽车的交通标志识别
由于特斯拉等公司在电动汽车自动化方面的努力,无人驾驶汽车正变得非常受欢迎。为了成为5级自动驾驶汽车,这些汽车必须正确识别交通标志并遵守交通规则。在识别出这些交通标志之后,它还应该能够适当地做出正确的决定。
代码医生工作室
2020/02/21
1.6K0
自动驾驶汽车的交通标志识别
使用Python实现深度学习模型:智能垃圾分类与回收系统
智能垃圾分类与回收系统通过深度学习技术,可以自动识别和分类不同类型的垃圾,提高垃圾回收效率,减少环境污染。本文将介绍如何使用Python和深度学习技术来实现智能垃圾分类与回收系统。
Echo_Wish
2024/08/20
5420
使用Python实现深度学习模型:智能垃圾分类与回收系统
使用Python实现深度学习模型:智能身份验证与防伪
在当今数字化时代,身份验证和防伪技术变得尤为重要。深度学习作为人工智能的一个重要分支,提供了强大的工具来解决这些问题。本文将介绍如何使用Python实现一个基于深度学习的智能身份验证与防伪系统,详细讲解其基本原理和实现步骤。
Echo_Wish
2024/10/08
2580
使用Python实现深度学习模型:智能身份验证与防伪
独家 | 10分钟搭建你的第一个图像识别模型(附步骤、代码)
本文介绍了图像识别的深度学习模型的建立过程,通过陈述实际比赛的问题、介绍模型框架和展示解决方案代码,为初学者提供了解决图像识别问题的基础框架。
数据派THU
2019/03/08
1.7K0
独家 | 10分钟搭建你的第一个图像识别模型(附步骤、代码)
使用Python实现深度学习模型:智能安防监控与异常检测
在这篇教程中,我们将构建一个深度学习模型,用于智能安防监控和异常检测。我们将使用TensorFlow和Keras库来实现这一目标。通过这个教程,你将学会如何处理视频数据、构建和训练模型,并将模型应用于实际的异常检测任务。
Echo_Wish
2024/07/27
2950
使用Python实现深度学习模型:智能安防监控与异常检测
Transformers 4.37 中文文档(四)
www.youtube-nocookie.com/embed/KWwzcmG98Ds
ApacheCN_飞龙
2024/06/26
5230
Transformers 4.37 中文文档(四)
使用卷积神经网络预防疲劳驾驶事故
美国国家公路交通安全管理局估计,每年有 91,000 起车祸涉及疲劳驾驶的司机,造成约50,000 人受伤和近 800 人死亡。此外,每 24 名成年司机中就有 1 人报告在过去 30 天内在驾驶时睡着了。研究甚至发现,超过20个小时不睡觉相当于血液酒精浓度为0.08%——美国的法律规定的上限。
小白学视觉
2021/10/14
5110
基于卷积神经网络的人脸识别[通俗易懂]
利用opencv获取人脸,采集人脸数据,将收集到的人脸数据加载到内存,搭建属于自己的卷积神经网络,并用人脸数据训练自己的网络,将训练好的网络保存成模型,最后再用opencv获取实时人脸用先前训练好的模型来识别人脸。
全栈程序员站长
2022/09/06
1.3K0
基于卷积神经网络的人脸识别[通俗易懂]
探究肺癌患者的CT图像的图像特征并构建一个诊断模型
准备工作: 1.准备肺癌或非肺癌每个各10张图,在本地创建一个名为“data”的文件夹,用于存放数据集。在“data”文件夹下创建两个子文件夹,分别命名为“cancer”和“non_cancer”,用于存放肺癌和非肺癌图像。将10张肺癌图像命名为“cancer_1.jpg”到“cancer_10.jpg”,并将它们放入“cancer”文件夹中。将10张非肺癌图像命名为“non_cancer_1.jpg”到“non_cancer_10.jpg”,并将它们放入“non_cancer”文件夹中。
未名编程
2024/10/12
1960
探究肺癌患者的CT图像的图像特征并构建一个诊断模型
基于 Keras 和 dlib 的人脸识别实践
这次的实践是基于很小的数据集,搭建的系统也比较粗糙,只是个toy implementation。主要用来练手和熟悉流程的。
caoqi95
2019/03/27
1.2K0
基于 Keras 和 dlib 的人脸识别实践
“花朵分类“ 手把手搭建【卷积神经网络】
本文介绍卷积神经网络的入门案例,通过搭建和训练一个模型,来对几种常见的花朵进行识别分类;
一颗小树x
2021/05/13
2.1K0
“花朵分类“ 手把手搭建【卷积神经网络】
使用Python实现图像分类与识别模型
图像分类与识别是计算机视觉中的重要任务,它可以帮助我们自动识别图像中的对象、场景或者特征。在本文中,我们将介绍图像分类与识别的基本原理和常见的实现方法,并使用Python来实现这些模型。
Echo_Wish
2024/04/23
1.1K0
使用Python实现深度学习模型:智能垃圾分类与环境保护
智能垃圾分类是实现环境保护和资源回收的重要手段。通过深度学习技术,我们可以自动识别和分类垃圾,从而提高垃圾处理的效率。本文将介绍如何使用Python和深度学习库TensorFlow与Keras来构建一个简单的垃圾分类模型。
Echo_Wish
2024/08/07
3510
使用Python实现深度学习模型:智能垃圾分类与环境保护
Google全新AI实战课发布:从原理到代码,手把手带你入门机器学习
安妮 岳排槐 发自 凹非寺 量子位 出品 | 公众号 QbitAI 如果你的心里只有一件事。 请问:是不是学习? Google希望你是,而且还准备扶上马,再送一程。 所以今天一早,大礼包又来了。 手把手教你 今年春天,Google发布了机器学习速成课,英文简称MLCC。而且这套基本全程都有中文的课程,还是完全免费的。 这还不够。 Google觉得光学理论还不够,必须教你理论与实战相结合。 所谓:知行合一。 于是,Google发布了最新的一套课程:
量子位
2018/07/20
7550
独家 | 手把手教你用Python构建你的第一个多标签图像分类模型(附案例)
翻译:吴金笛 校对:郑滋 本文约4600字,建议阅读12分钟。 本文明确了多标签图像分类的概念,并讲解了如何构建多标签图像分类模型。 介绍 你正在处理图像数据吗?我们可以使用计算机视觉算法来做很多事情
数据派THU
2019/05/17
1.9K0
独家 | 手把手教你用Python构建你的第一个多标签图像分类模型(附案例)
使用Python实现深度学习模型:视频处理与动作识别
视频处理与动作识别是计算机视觉中的重要任务,广泛应用于监控系统、智能家居、体育分析等领域。通过使用Python和深度学习技术,我们可以构建一个简单的动作识别系统。本文将介绍如何使用Python实现视频处理与动作识别,并提供详细的代码示例。
Echo_Wish
2024/07/16
7510
使用Python实现深度学习模型:视频处理与动作识别
小狗分类器,你家的狗子是个什么狗?
这就是所谓的「机器学习」,让机器自己去“学习”。我们今天要做的这个分类任务,是一个“监督学习”的过程。
小小詹同学
2019/08/28
5590
小狗分类器,你家的狗子是个什么狗?
推荐阅读
相关推荐
手把手教你使用CNN进行交通标志识别(已开源)
更多 >
LV.0
深圳魔图互联科技有限公司算法工程师
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验