学习flink的state

简介: Apache Flink® — Stateful Computations over Data Streams,数据流上的状态计算。可以看出flink默认它是一个默认就有状态的分析引擎,State一般指一个具体的 Task/Operator 的状态,State数据默认保存在 Java 的堆内存中。假设一个 Task 在处理过程中挂掉了,那么它在内存中的状态都会丢失,所有的数据都需要重新计算。从容错和消息处理的语义(At -least-once 和 Exactly-once)上来说,Flink引入了State 和 CheckPoint。

一、概述

1、简介

我们来看一下flink的介绍,
Apache Flink® — Stateful Computations over Data Streams,数据流上的状态计算。可以看出flink默认它是一个默认就有状态的分析引擎,State一般指一个具体的 Task/Operator 的状态,State数据默认保存在 Java 的堆内存中。

假设一个 Task 在处理过程中挂掉了,那么它在内存中的状态都会丢失,所有的数据都需要重新计算。从容错和消息处理的语义(At -least-once 和 Exactly-once)上来说,Flink引入了State 和 CheckPoint。

例如:WordCount 案例可以做到单词的数量的累加,其实是因为在内存中保证了每个单词的出现的次数,这些数据其实就是状态数据。

2、 State backend

现在你大概知道了state是什么,那么这些 state 存储的介质有哪些? Flink 提供了三种存储 State的介质。

2.1、MemoryStateBackend

使用方法:
MemoryStateBackend( int maxStateSize, boolean asynchronousSnapshots )

存储位置:
State: TaskManager 内存
Checkpoint: Jobmanager 内存

使用场景:
本地测试用,不推荐生产场景使用

2.2、FsStatebackend:

使用方法:
FaStateBackend( URI checkpointDataUri, boolean asynchronousSnapshots )

存储位置:
State:Taskmanager 内存
Checkpoint: 外部文件系统( 本地或 HDFS )

使用场景:
常规使用 State 的作业,可以在生产中使用

2.3、 RocksDBStateBackend

使用方法:
RocksDBStateBackend( URI checkpointDataUri, boolean enableIncrementalCheckpointing )

存储位置:
State: TaskManager 上的 KV 数据库(实际使用内存 + 磁盘)
Checkpoint: 外部文件系统(本地或 HDFS )

使用场景:
超大状态作业,对性能要求不高的生产场景

二、state的类型

Flink中有原生状态、托管状态两种基本类型的State,这两种类型的state都可以使用Operator State(算子状态)、keyed State(键控状态)这两种形式操作。

1、原生状态(raw state)

由用户操作算子自己管理数据结构,当触发Checkpoint操作过程中,Flink并不知道状态数据内部的数据结构,只是将数据转换成bytes数据存储在Checkpoints中,当从Checkpoints恢复任务时,算子自己再反序列化出状态的数据结构。

2、托管状态(managed state)

由Flink Runtime控制和管理状态数据,并将状态数据转换成为内存的Hash tables或 RocksDB的对象存储,然后将这些数据通过内部的接口持久化到checkpoints中,如果任务发生异常时,可以通过这些状态数据恢复任务。

下面是两种状态的比较表格,推荐使用ManagedState管理状态数据,ManagedState更好的支持状态数据的重平衡以及更加完善的内存管理

Managed State Raw State
状态管理方式 Flink Runtime托管,自动存储、自动恢复、自动伸缩 用户自己管理
状态数据结构 Flink提供的常用数据结构,如ListState、MapState等 字节数组:byte[]
使用场景 绝大多数Flink算子 用户自定义算子

3、两种形式

3.1 Operator State(算子状态)

operator state是task级别的state,说白了就是每个task对应一个state。
Kafka Connector source中的每个分区(task)都需要记录消费的topic的partition和offset等信息。
对于Operator State,我们还需进一步实现CheckpointedFunction接口。
se01.png

它经常被用在Source或Sink等算子上,用来保存流入数据的偏移量或对输出数据做缓存,以保证Flink应用的Exactly-Once语义。

3.2 keyed State(键控状态)

keyed State使用场景广泛,它是基于KeyedStream上的状态,这个状态是跟特定的Key 绑定的。KeyedStream流上的每一个Key,都对应一个State。Flink针对 Keyed State 提供了下面几种数据结构的(托管状态)Keyed state保存State。
se02.png

3.2.1、ValueState

保存一个可以更新和检索的值(例如:每个值都对应到当前的输入数据的key,因此算子接收到的每个key都可能对应一个值)。 这个值可以通过update(T) 进行更新,通过 T value() 进行检索 。

3.2.2、ListState

保存一个元素的列表。可以往这个列表中追加数据,并在当前的列表上进行检索。可以通过 add(T) 或者 addAll(List) 进行添加元素,通过 Iterable get() 获得整个列表。还可以通过 update(List) 覆盖当前的列表 。

3.2.3、MapState

维护了一个映射列表。 你可以添加键值对到状态中,也可以获得 反映当前所有映射的迭代器。使用 put(UK,UV) 或者 putAll(Map<UK,UV>) 添加映射。 使用 get(UK) 检索特定 key。 使用 entries(),keys() 和 values() 分别检索映射、 键和值的可迭代视图。

3.2.4、ReducingState

保存一个单值,表示添加到状态的所有值的聚合。接口与ListState类似,但使用add(T) 增加元素,会使用提供的 ReduceFunction 进行聚合。

3.2.5、AggregatingState

AggregatingState<IN, OUT>: 保留一个单值,表示添加到状态的所有值的聚合。和 ReducingState 相反的是, 聚合类型可能与添加到状态的元素的类型不同。 接口与 ListState类似,但使用 add(IN) 添加的元素会用指定的 AggregateFunction 进行聚合

3.2.6、上述keyedState大体的使用方法

1、只能用于RichFunction
2、将State 声明为实例变量
3、在 open() 方法中为State赋值创建一个StateDescriptor利用getRuntimeContext().getXXState(...)构建不同的State
4、调用State的方法进行读写例如 state.value()、state.update(...)等等

相关实践学习
基于Hologres+Flink搭建GitHub实时数据大屏
通过使用Flink、Hologres构建实时数仓,并通过Hologres对接BI分析工具(以DataV为例),实现海量数据实时分析.
实时计算 Flink 实战课程
如何使用实时计算 Flink 搞定数据处理难题?实时计算 Flink 极客训练营产品、技术专家齐上阵,从开源 Flink功能介绍到实时计算 Flink 优势详解,现场实操,5天即可上手! 欢迎开通实时计算 Flink 版: https://cn.aliyun.com/product/bigdata/sc Flink Forward Asia 介绍: Flink Forward 是由 Apache 官方授权,Apache Flink Community China 支持的会议,通过参会不仅可以了解到 Flink 社区的最新动态和发展计划,还可以了解到国内外一线大厂围绕 Flink 生态的生产实践经验,是 Flink 开发者和使用者不可错过的盛会。 去年经过品牌升级后的 Flink Forward Asia 吸引了超过2000人线下参与,一举成为国内最大的 Apache 顶级项目会议。结合2020年的特殊情况,Flink Forward Asia 2020 将在12月26日以线上峰会的形式与大家见面。
目录
相关文章
|
SQL 运维 API
Apache Flink 学习教程----持续更新
Apache Flink 学习教程----持续更新
554 0
|
SQL Java API
flink问题之state过期设置如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
592 0
|
SQL 消息中间件 分布式数据库
Flink问题之State 0点清除如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
305 0
|
SQL 消息中间件 分布式计算
大数据-124 - Flink State 01篇 状态原理和原理剖析:状态类型 执行分析
大数据-124 - Flink State 01篇 状态原理和原理剖析:状态类型 执行分析
257 5
|
12月前
|
存储 SQL 数据挖掘
深入理解 Flink 中的 State
Flink 的 State(状态)是其四大核心之一,为流处理和批处理任务提供强大支持。本文深入探讨 Flink 中的状态管理,涵盖 State 在 HDFS 中的存储格式、存在形式(如 ValueState、ListState 等)、使用方法、过期时间 TTL 和清除策略,并介绍 Table API 和 SQL 模块中的状态管理。通过实际案例,帮助读者理解如何在电商订单处理、实时日志统计等场景中有效利用状态管理功能。
1147 16
|
消息中间件 应用服务中间件 API
Flink四大基石——3.State
Flink四大基石——3.State
246 1
|
SQL 流计算
Flink SQL 在快手实践问题之由于meta信息变化导致的state向前兼容问题如何解决
Flink SQL 在快手实践问题之由于meta信息变化导致的state向前兼容问题如何解决
188 1
|
存储 SQL 分布式计算
大数据-127 - Flink State 04篇 状态原理和原理剖析:状态存储 Part2
大数据-127 - Flink State 04篇 状态原理和原理剖析:状态存储 Part2
155 0
|
存储 消息中间件 大数据
大数据-126 - Flink State 03篇 状态原理和原理剖析:状态存储 Part1
大数据-126 - Flink State 03篇 状态原理和原理剖析:状态存储 Part1
299 0
|
存储 SQL 分布式计算
大数据-125 - Flink State 02篇 状态原理和原理剖析:广播状态
大数据-125 - Flink State 02篇 状态原理和原理剖析:广播状态
218 0