Flink流处理:温度跳变检测与状态管理

#新星杯·14天创作挑战营·第11期#

目录

1. 代码结构总结

主要功能模块

核心类与方法

2. 代码原理拓展

Flink 状态管理的核心概念

Flink 检查点机制的核心概念

3. 代码优化与扩展

优化建议

功能扩展

4. 示例代码扩展

5. 总结


 

package api

import java.util
import java.util.concurrent.TimeUnit

import org.apache.flink.api.common.functions.{RichFlatMapFunction, RichMapFunction}
import org.apache.flink.api.common.restartstrategy.RestartStrategies
import org.apache.flink.api.common.state.StateTtlConfig.RocksdbCompactFilterCleanupStrategy
import org.apache.flink.api.common.state.{ListStateDescriptor, MapStateDescriptor, ReducingStateDescriptor, ValueState, ValueStateDescriptor}
import org.apache.flink.api.common.time.Time
import org.apache.flink.configuration.Configuration
import org.apache.flink.runtime.state.filesystem.FsStateBackend
import org.apache.flink.runtime.state.memory.MemoryStateBackend
import org.apache.flink.streaming.api.CheckpointingMode
import org.apache.flink.streaming.api.scala._
import org.apache.flink.util.Collector

/**
 *
 * @PROJECT_NAME: Flink
 * @PACKAGE_NAME: api
 * @author: 赵嘉盟-HONOR
 * @data: 2025-5-15 21:06
 * @DESCRIPTION
 *
 */
object State {
  def main(args: Array[String]): Unit = {
    val env=StreamExecutionEnvironment.getExecutionEnvironment
    env.setParallelism(1)

    //状态后端配置
    //env.setStateBackend( new MemoryStateBackend())         //内存状态后端
    //env.setStateBackend( new FsStateBackend("保存地址",异步快照))    //文件状态后端
    //env.setStateBackend ( new RocksDBStateBackend())

    //检查点配置
    env.enableCheckpointing(1000L)   //启用检查点
    env.getCheckpointConfig.setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE)    //配置检查点算法
    env.getCheckpointConfig.setCheckpointTimeout(60000L)     //设置超时时间
    env.getCheckpointConfig.setMaxConcurrentCheckpoints(5)  //最多允许几个检查点同时工作
    env.getCheckpointConfig.setMinPauseBetweenCheckpoints(500) //两个检查点最小间隔(与max冲突)
    //env.getCheckpointConfig.setPreferCheckpointForRecovery(true)    //是否只用检查点(默认false)
    env.getCheckpointConfig.setTolerableCheckpointFailureNumber(3)  //最大失败次数

    //重启策略配置
    env.setRestartStrategy(RestartStrategies.fixedDelayRestart(3,10000L))   //重启三次,每次间隔10s
    env.setRestartStrategy(RestartStrategies.failureRateRestart(5,Time.of(5,TimeUnit.MINUTES),Time.of(10,TimeUnit.SECONDS)))//五分钟内重启五次,每次间隔10s

    val inputStream=env.socketTextStream("localhost",7777)
    val dataStream=inputStream
      .map( data=>{
        val arr=data.split(",")
        SensorReading(arr(0),arr(1).toLong,arr(2).toDouble)
      })


    //需求:对于温度传感器温度值跳变,超过十度报警
    val alertState=dataStream
      .keyBy(_.id)
      //.flatMap( new TempChangeAlert(10.0))
      .flatMapWithState[(String,Double,Double),Double]{
        case (data:SensorReading,None) =>( List.empty ,Some(data.temperature))    //第一次没有状态的初始化
        case (data,lastTemp:Some[Double])=>{
          val diff=(data.temperature-lastTemp.get).abs
          if(diff>10.0)
            (List((data.id,lastTemp.get,data.temperature)),Some(data.temperature))  //超过阈值报警
          else
            (List.empty,Some(data.temperature))                                     //没有超过阈值更新状态
        }
      }
    alertState.print()

    env.execute("state")
  }
}



//实现自定义RichFlatMapFunction
class TempChangeAlert(threshold :Double) extends RichFlatMapFunction[SensorReading,(String,Double,Double)]{
  //定义状态保存上一次的温度值
  lazy val lastTempState=getRuntimeContext.getState( new ValueStateDescriptor[Double]("last_temp",classOf[Double]))
  var first = false
  override def flatMap(in: SensorReading, collector: Collector[(String, Double, Double)]): Unit = {
    //判断是否第一次运行
    if(first==false){
      first=true
      lastTempState.update(in.temperature)
    }
    //获取上一次的温度值
    val lastTemp=lastTempState.value()
    //跟最新的温度值作比较
    val diff=(in.temperature-lastTemp).abs

    if (diff > threshold){
      collector.collect((in.id,lastTemp,in.temperature))
    }
    //更新状态
    lastTempState.update(in.temperature)

  }
}



//keyed satte 测试:必须定义在RichFunction中,因为需要运行时上下文
class MyRichMapper1 extends  RichMapFunction[SensorReading,String]{
  var valueState:ValueState[Double]=_
  lazy val listState=getRuntimeContext.getListState( new ListStateDescriptor[Int]("list",classOf[Int])) //listState简易定义方法
  lazy val mapState=getRuntimeContext.getMapState(new MapStateDescriptor[String,Double]("map",classOf[String],classOf[Double]))
  lazy val reduceState=getRuntimeContext.getReducingState(new ReducingStateDescriptor[SensorReading]("reduce",new MyReduceFunction,classOf[SensorReading]))

  override def open(parameters: Configuration): Unit = {
    valueState=getRuntimeContext.getState( new ValueStateDescriptor[Double]("value",classOf[Double]))
  }

  override def map(in: SensorReading): String = {
    //状态的读写
    val myV=valueState.value()  //读取
    valueState.update(in.temperature)      //更改

    //listState方法
    listState.add(2)
    val list = new util.ArrayList[Int]()
    list.add(3)
    list.add(4)
    listState.addAll(list)  //追加
    listState.update(list)  //覆盖
    listState.get()         //获取

    //map方法
    mapState.contains("sensor_1") //判断存在
    mapState.get("sensor_1")      //获取value
    mapState.put("sensor_1",1.2)  //修改value

    //reduce方法
    reduceState.get() //聚合后的值
    reduceState.add(in) //聚合新输入的值
    in.id
  }
}

这段代码是一个基于 Apache Flink 的流处理程序,主要功能是通过 状态管理 和 检查点机制 实现传感器数据的温度跳变检测。以下是代码的总结和原理拓展:


1. 代码结构总结

主要功能模块
  1. 数据源读取
    • 从 Socket 读取数据流(localhost:7777),数据格式为 id,timestamp,temperature
  2. 数据处理
    • 使用 map() 方法将输入数据转换为 SensorReading 对象。
    • 使用 Keyed State 和 FlatMapWithState 实现温度跳变检测,当温度变化超过阈值时触发报警。
  3. 状态管理
    • 使用 ValueState 保存上一次的温度值,并通过 RichFlatMapFunction 实现状态的管理和更新。
  4. 检查点与重启策略
    • 配置检查点机制和重启策略,确保程序的容错性和可靠性。
核心类与方法
  • SensorReading
    • 样例类,用于表示传感器的数据(ID、时间戳、温度)。
  • RichFlatMapFunction
    • Flink 提供的富函数,可以访问状态、运行时上下文等底层功能。
  • ValueState
    • 用于保存单个值的状态,通过 ValueStateDescriptor 定义。
  • FlatMapWithState
    • 结合状态管理的流处理函数,支持状态初始化、更新和输出。
  • CheckpointConfig
    • 配置检查点机制,包括检查点间隔、超时时间、并发检查点等。
  • RestartStrategies
    • 配置重启策略,包括固定延迟重启和失败率重启。

2. 代码原理拓展

Flink 状态管理的核心概念
  1. Keyed State

    • 与 Key 绑定的状态,只能在 KeyedStream 中使用。
    • 支持的类型包括 ValueStateListStateMapStateReducingState 等。
    • 通过 getRuntimeContext().getState() 获取状态。
  2. Operator State

    • 与算子绑定的状态,所有并行实例共享相同的状态。
    • 支持的类型包括 ListStateBroadcastState 等。
  3. 状态后端(State Backend)

    • 负责状态的存储和访问,支持的类型包括:
      • MemoryStateBackend:状态存储在内存中,适用于小规模数据。
      • FsStateBackend:状态存储在文件系统中,适用于大规模数据。
      • RocksDBStateBackend:状态存储在 RocksDB 中,适用于超大规模数据。
  4. 状态生命周期

    • 状态在算子初始化时创建,在算子关闭时销毁。
    • 通过 open() 和 close() 方法管理状态的初始化和清理。
Flink 检查点机制的核心概念
  1. 检查点(Checkpoint)

    • 定期将状态保存到持久化存储中,用于故障恢复。
    • 支持 EXACTLY_ONCE 和 AT_LEAST_ONCE 两种语义。
  2. 检查点配置

    • enableCheckpointing():启用检查点,并设置检查点间隔。
    • setCheckpointTimeout():设置检查点超时时间。
    • setMaxConcurrentCheckpoints():设置最大并发检查点数。
    • setMinPauseBetweenCheckpoints():设置检查点之间的最小间隔。
  3. 重启策略(Restart Strategy)

    • fixedDelayRestart():固定延迟重启,指定重启次数和延迟时间。
    • failureRateRestart():失败率重启,指定时间窗口内的最大失败次数和延迟时间。

3. 代码优化与扩展

优化建议
  1. 状态清理

    • 使用 StateTtlConfig 配置状态的生存时间(TTL),自动清理过期状态。
  2. 状态序列化

    • 优化状态的序列化方式,减少状态存储和传输的开销。
  3. 检查点性能

    • 根据数据量和硬件资源,调整检查点间隔和并发检查点数,平衡性能和可靠性。
功能扩展
  1. 复杂状态管理

    • 使用 MapState 或 ListState 实现更复杂的状态管理逻辑。
  2. 事件时间处理

    • 结合事件时间和水位线(Watermark),实现基于时间的状态管理。
  3. 状态查询

    • 使用 QueryableState 实现状态的实时查询,便于监控和调试。
  4. 自定义状态后端

    • 实现自定义的状态后端,支持特定的存储系统或优化策略。

4. 示例代码扩展

以下是一个扩展示例,展示如何使用 StateTtlConfig 配置状态的生存时间:

import org.apache.flink.api.common.state.StateTtlConfig
import org.apache.flink.api.common.time.Time

// 配置状态的生存时间(TTL)
val ttlConfig = StateTtlConfig
  .newBuilder(Time.minutes(5)) // 状态生存时间为 5 分钟
  .setUpdateType(StateTtlConfig.UpdateType.OnCreateAndWrite) // 每次创建和写入时更新 TTL
  .setStateVisibility(StateTtlConfig.StateVisibility.NeverReturnExpired) // 不返回过期状态
  .build()

// 定义 ValueStateDescriptor 并设置 TTL
val stateDescriptor = new ValueStateDescriptor[Double]("last_temp", classOf[Double])
stateDescriptor.enableTimeToLive(ttlConfig)

5. 总结

  1. 核心功能
    • 通过 ValueState 和 RichFlatMapFunction 实现温度跳变检测,当温度变化超过阈值时触发报警。
  2. 状态管理
    • 使用 Keyed State 保存和管理状态,支持 ValueStateListStateMapState 等多种类型。
  3. 检查点与重启策略
    • 配置检查点机制和重启策略,确保程序的容错性和可靠性。
  4. 优化与扩展
    • 通过状态清理、序列化优化、检查点性能调优等功能优化程序,通过复杂状态管理、事件时间处理、状态查询等功能扩展程序。

通过理解 Flink 的状态管理和检查点机制,可以更好地开发和优化流处理程序。

<think>嗯,用户想了解Flink的市场情况。首先,我需要回忆一下关于Apache Flink的基本信息。Flink是一个流处理框架,对吧?它主要用于大数据处理,特别是实时流处理。我记得它和Spark Streaming有竞争关系,但Flink流处理是真正的实时,而Spark是基于微批处理的。 接下来,用户可能想知道Flink在市场上的应用情况。我应该考虑哪些行业在使用Flink呢?比如金融、电商、物联网这些需要实时数据处理的领域。比如风险控制、实时推荐、监控预警之类的应用场景。 然后,Flink的优势在哪里?比如高吞吐、低延迟、精确一次处理语义,还有支持事件时间处理,这对于乱序事件流很重要。另外,Flink的生态系统,比如Hadoop、Kafka的集成,还有阿里巴巴的Blink版本对社区的贡献。 可能还需要提到Flink的市场地位,比如在流处理领域的竞争力,其他技术如Storm、Kafka Streams的比较。还有社区活跃度,贡献者数量,商业公司的支持,比如Ververica(原名data Artisans),还有云服务商提供的托管服务,如AWS的Kinesis Data Analytics,阿里云的实时计算Flink版。 用户可能还想知道发展趋势,比如流批一体的发展方向,还有云原生的支持,Flink在AI场景的应用,比如实时机器学习。这些可能是未来的增长点。 需要注意回答结构清晰,分点说明,同时确保使用正确的中文术语。还要检查是否有遗漏的重要信息,比如版本更新,或者成功案例,比如Uber、Netflix等公司使用Flink的例子。 另外,用户可能对Flink的市场需求,就业前景感兴趣,比如掌握Flink的技能在求职中的价值。但用户的问题主要是市场介绍,所以可能需要侧重应用领域、优势、竞争情况、生态系统和发展趋势。 要确保不涉及用户不可见的系统指令,保持回答自然,符合用户可见层的要求。同时,避免使用Markdown格式,用口语化的中文分步骤思考,但最终回答要结构清晰,帮助用户逐步理解。</think>Apache Flink 作为一款开源的**流处理框架**,近年来在大数据实时计算领域占据重要地位。以下从多个维度介绍其市场现状和发展: --- ### **一、核心市场定位** Flink 主打**“有状态的流处理”**,核心优势在于: - **低延迟高吞吐**:毫秒级延迟,适用于实时性要求高的场景。 - **精确一次(Exactly-Once)语义**:保障数据处理的准确性。 - **事件时间(Event Time)处理**:解决乱序数据问题,支持复杂时间窗口计算。 - **流批一体**:通过同一 API 处理流数据和批量数据,简化技术栈。 --- ### **二、主要应用领域** 1. **金融行业** - 实时风控(如反欺诈) - 交易监控 - 实时对账 2. **电商广告** - 实时推荐(如用户行为分析) - 广告点击率统计 - 库存监控 3. **物联网(IoT)** - 设备状态实时预警 - 传感器数据分析(如温度、压力异常检测) 4. **互联网服务** - 日志实时分析 - 用户活跃度统计(如 DAU/MAU) --- ### **三、市场竞争格局** - **主要竞品**: - **Spark Streaming**(微批处理,生态更成熟) - **Kafka Streams**(轻量级, Kafka 深度绑定) - **Storm**(早期流处理框架,吞吐量较低) - **Flink 的差异化优势**: - 真正的流处理架构(非微批模拟) - 社区活跃度高(Apache 顶级项目,阿里等大厂持续贡献) - 云原生支持(Kubernetes 集成) --- ### **四、生态系统商业支持** - **开源生态**: - 连接器:支持 Kafka、Hadoop、HBase 等主流数据源。 - 机器学习:Flink ML 提供实时模型训练能力。 - SQL 支持:通过 Flink SQL 降低开发门槛。 - **商业公司支持**: - **Ververica**(Flink 创始团队创立,提供企业版支持) - **云厂商托管服务**:AWS Kinesis Data Analytics、阿里云实时计算 Flink 版、腾讯云 Oceanus 等。 --- ### **五、发展趋势** 1. **流批融合深化**:进一步统一流、批、机器学习工作流。 2. **云原生架构**:基于 Kubernetes 的弹性扩缩容能力。 3. **AI 场景扩展**:实时特征工程、在线学习等。 4. **边缘计算**: IoT 设备结合,实现边缘实时处理。 --- ### **六、就业市场需求** 掌握 Flink 的技能(如状态管理、CEP 复杂事件处理)是**大数据开发岗位**的重要加分项。头部互联网企业(如阿里、字节跳动)和金融科技公司均有大量实时计算岗位需求。 --- ### **总结** Flink 凭借其**高性能流处理能力**和**持续创新的生态**,已成为实时计算领域的标杆技术。随着企业对实时数据分析需求的增长,Flink 的市场渗透率预计将持续提升。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渣渣盟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值