Flink笔记整理(六)

Flink笔记整理(六)

完整系列在公众号:是十三不是四十三,欢迎关注~


八、状态管理

8.1 Flink中的状态

概述

在这里插入图片描述

状态的分类

  • 托管状态(Managed State)和原始状态(Raw State)

Flink的状态有两种:托管状态(Managed State)和原始状态(Raw State)。托管状态就是由Flink统一管理的,状态的存储访问、故障恢复和重组等一系列问题都由Flink实现,我们只要调接口就可以;而原始状态则是自定义的,相当于就是开辟了一块内存,需要我们自己管理,实现状态的序列化和故障恢复。
通常我们采用Flink托管状态来实现需求。

  • 算子状态(Operator State)和按键分区状态(Keyed State)
    接下来重点就是托管状态(Managed State)。

在Flink中,一个算子任务会按照并行度分为多个并行子任务执行,而不同的子任务会占据不同的任务槽(task slot)。由于不同的slot在计算资源上是物理隔离的,所以Flink能管理的状态在并行任务间是无法共享的,每个状态只能针对当前子任务的实例有效。

而很多有状态的操作(比如聚合、窗口)都是要先做keyBy进行按键分区的。按键分区之后,任务所进行的所有计算都应该只针对当前key有效,所以状态也应该按照key彼此隔离。在这种情况下,状态的访问方式又会有所不同。

基于这样的想法,又可以将托管状态分为两类:算子状态和按键分区状态。

在这里插入图片描述
聚合算子必须在keyBy之后才能用
另外,也可以通过富函数类(Rich Function)来自定义Keyed State,所以只要提供了富函数类接口的算子,也都可以使用Keyed State。所以即使是map、filter这样无状态的基本转换算子,我们也可以通过富函数类给它们“追加”Keyed State。比如RichMapFunction、RichFilterFunction。在富函数中,我们可以调用.getRuntimeContext()获取当前的运行时上下文(RuntimeContext),进而获取到访问状态的句柄;这种富函数中自定义的状态也是Keyed State。从这个角度讲,Flink中所有的算子都可以是有状态的。
无论是Keyed State还是Operator State,它们都是在本地实例上维护的,也就是说每个并行子任务维护着对应的状态,算子的子任务之间状态不共享。

8.2 按键分区状态(Keyed State)

按键分区状态(Keyed State)顾名思义,是任务按照键(key)来访问和维护的状态。它的特点非常鲜明,就是以key为作用范围进行隔离。

需要注意,使用Keyed State必须基于KeyedStream。没有进行keyBy分区的DataStream,即使转换算子实现了对应的富函数类,也不能通过运行时上下文访问Keyed State。

Flink按键分区状态(Keyed State)以及代码

值状态(ValueState)

ValueState

列表状态(ListState)

ListState

Map状态(MapState)

ValueState

归约状态(ReducingState)

ReducingState

聚合状态(AggregatingState)

AggregatingState

状态生存时间(TTL)

TTL

8.3 算子状态(Operator State)

算子状态(Operator State)就是一个算子并行实例上定义的状态,作用范围被限定为当前算子任务。算子状态跟数据的key无关,所以不同key的数据只要被分发到同一个并行子任务,就会访问到同一个Operator State。

算子状态的实际应用场景不如Keyed State多,一般用在Source或Sink等与外部系统连接的算子上,或者完全没有key定义的场景。比如Flink的Kafka连接器中,就用到了算子状态。

当算子的并行度发生变化时,算子状态也支持在并行的算子任务实例之间做重组分配。根据状态的类型不同,重组分配的方案也会不同。

算子状态也支持不同的结构类型,主要有三种:ListState、UnionListState和BroadcastState。

列表状态(ListState)

ListState

联合列表状态(UnionListState)

UnionListState

广播状态(BroadcastState)

BroadcastState

8.4 状态后端(State Backends)

在Flink中,状态的存储、访问以及维护,都是由一个可插拔的组件决定的,这个组件就叫作状态后端(state backend)。状态后端主要负责管理本地状态的存储方式和位置。

状态后端的分类(HashMapStateBackend/RocksDB)

状态后端的分类

如何选择正确的状态后端

如何选择正确的状态后端

状态后端的配置

状态后端的配置


总结

在这里插入图片描述

  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flink的安装目录下,主要有以下几个配置文件: 1. flink-conf.yaml:该文件是Flink的主要配置文件,用于设置Flink的全局配置。 2. 日志的配置文件:用于配置Flink的日志打印格式、级别等相关参数。 3. zk配置:用于配置Flink与ZooKeeper的连接信息,以便Flink可以使用ZooKeeper来实现高可用和容错机制。 4. Flink SQL Client配置:用于配置Flink SQL客户端的相关参数,如连接信息、默认目录等。 除了以上配置文件,根据table程序的需要,还可以通过配置一些必要的参数来优化表操作。举个例子,对于无界流程序,可能需要确定必要的状态大小上限。 在Java代码中,可以使用TableEnvironment的getConfig()方法获取Flink的配置对象,然后通过配置对象的setString()方法来设置底层的键值对配置。例如,可以通过以下方式设置mini-batch优化相关的配置参数: ```java // 实例化table environment TableEnvironment tEnv = ...; // 访问flink配置 Configuration configuration = tEnv.getConfig().getConfiguration(); // 设置底层key-value配置 configuration.setString("table.exec.mini-batch.enabled", "true"); // 开启mini-batch优化 configuration.setString("table.exec.mini-batch.allow-latency", "5 s"); // 缓存输入数据5秒 configuration.setString("table.exec.mini-batch.size", "5000"); // 每个聚合操作任务可以缓存的最大数据条数为5000条 ``` 通过以上配置,可以启用mini-batch优化,并设置相应的缓存参数,以提高表操作的性能和效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Flink 从 0 到 1 学习 —— Flink 配置文件详解](https://blog.csdn.net/tzs_1041218129/article/details/101104375)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [flink-sql查询配置与性能优化参数详解-1.14](https://blog.csdn.net/u012443641/article/details/127900815)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值