Flink-状态后端得定义及选择 | 状态编程求上次温度与此次温度对比相差指定额度进行报警 | 使用已有API实现

本文介绍了Flink的状态后端,强调了其在低延迟数据处理中的重要性。状态后端负责本地状态管理和远程检查点存储。文中通过一个实例展示了如何选择状态后端,并提供了一个应用示例,该示例监测温度变化,当两次读取的温度差超过10.0时触发报警。
摘要由CSDN通过智能技术生成

GitHub代码

https://github.com/SmallScorpion/flink-tutorial.git

状态后端(State Backends)

  1. 每传入一条数据,有状态的算子任务都会读取和更新状态
  2. 由于有效的状态访问对于处理数据的低延迟至关重要,因此每个并行任务都会在本地维护其状态,以确保快速的状态访问
  3. 状态的存储、访问以及维护,由一个可插入的组件决定,这个组件就叫做状态后端(state backend)
  4. 状态后端主要负责两件事:本地的状态管理,以及将检查点(checkpoint)状态写入远程存储

选择一个状态后端

在这里插入图片描述

Pom

        <!-- RocksDBStateBackend -->
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-statebackend-rocksdb_2.11</artifactId>
            <version>1.10.0</version>
        </dependency>

在集群模式 配置文件中也可以设置
在这里插入图片描述

状态小应用

获取上一次得温度,与这次获取得数据进行对比,两次温度相差10.0则进行报警输出,类似reduce算子

import com.atguigu.bean.SensorReading
import org.apache.flink.api.common.functions.RichFlatMapFunction
import org.apache.flink.api.common.state.{
   ValueState, ValueStateDescriptor}
import org.apache.flink.configuration.Configuration
import org.apache.flink.streaming.api.scala._
import org.apache.flink.util.Collector

object StateTempChangeAlertTest {
   
  def main(args: Array[String]): Unit = {
   
Flink状态后端决定了Flink如何存储和管理状态数据Flink内置了多种状态后端,如MemoryStateBackend、FsStateBackend和RocksDBStateBackend等。如果这些内置的状态后端不能满足你的需,你可以自定义状态后端。 自定义状态后端需要实现StateBackend接口,并重写相关方法。其中,主要包括以下几个方法: - createKeyedStateBackend:创建一个KeyedStateBackend实例,用于管理键控状态。 - createOperatorStateBackend:创建一个OperatorStateBackend实例,用于管理算子状态。 - supportsAsynchronousSnapshots:是否支持异步快照。 - getDefaultStateBackend:获取默认的状态后端。 下面是一个自定义状态后端的示例代码: ```java public class MyStateBackend implements StateBackend { @Override public CheckpointStorage createCheckpointStorage(JobID jobId) throws IOException { // 创建一个CheckpointStorage实例,用于管理检查点数据的存储和恢复 return new MyCheckpointStorage(); } @Override public <K> AbstractKeyedStateBackend<K> createKeyedStateBackend( Environment env, JobID jobID, String operatorIdentifier, TypeSerializer<K> keySerializer, int numberOfKeyGroups, KeyGroupRange keyGroupRange, TaskKvStateRegistry kvStateRegistry, TtlTimeProvider ttlTimeProvider, MetricGroup metricGroup, @Nonnull Collection<KeyedStateHandle> stateHandles, CloseableRegistry cancelStreamRegistry) throws Exception { // 创建一个KeyedStateBackend实例,用于管理键控状态 return new MyKeyedStateBackend<>( env, jobID, keySerializer, numberOfKeyGroups, keyGroupRange, kvStateRegistry, ttlTimeProvider, metricGroup, stateHandles, cancelStreamRegistry); } @Override public OperatorStateBackend createOperatorStateBackend( Environment env, String operatorIdentifier, @Nonnull Collection<OperatorStateHandle> stateHandles, CloseableRegistry cancelStreamRegistry) throws Exception { // 创建一个OperatorStateBackend实例,用于管理算子状态 return new MyOperatorStateBackend( env, operatorIdentifier, stateHandles, cancelStreamRegistry); } @Override public boolean supportsAsynchronousSnapshots() { // 是否支持异步快照 return true; } @Override public StateBackend configure(Configuration config, ClassLoader classLoader) { // 配置状态后端 return this; } } ``` 在自定义状态后端中,你可以根据自己的需选择不同的存储方式来管理状态数据。例如,你可以使用自己的数据库来存储状态数据,或者使用分布式文件系统来存储检查点数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值