Spark-Streaming核心编程

无状态转换操作与有状态转换操作

无状态转换操作

无状态转换操作是指在固定的时间跨度内进行数据处理,不涉及跨批次的数据处理。

例如,设置采集时间为三秒,则只对这三秒内的数据进行计算和聚合。

有状态转换操作

有状态转换操作涉及跨批次的数据处理,可以将不同批次的数据放在一起进行处理。

主要包括两种操作:updateStateByKey 和 window operations。

updateStateByKey

功能

用于记录历史记录,跨批次维护状态。

例如,进行累加操作,统计所有输入数据的累加值。

实现步骤

定义状态:状态可以是任意数据类型。

定义状态更新函数:根据新的事件更新每一个键对应的状态。

代码示例

java 复制代码
import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}

object UpdateStateByKey {
  def main(args: Array[String]): Unit = {
    val updateFunc = (values:Seq[Int],state:Option[Int])=>{
      val currentCount = values.foldLeft(0)(_+_)
      val previousCount = state.getOrElse(0)
      Some(currentCount+previousCount)
    }
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("update")
    val ssc = new StreamingContext(sparkConf,Seconds(5))
    ssc.checkpoint("./ck")

    val lines = ssc.socketTextStream("node01",9999)
    val words = lines.flatMap(_.split(" "))
    val pairs = words.map((_,1))
    val stateDStream = pairs.updateStateByKey[Int](updateFunc)
    stateDStream.print()

    ssc.start()
    ssc.awaitTermination()


  }
  }

运行结果

通过定义更新函数,获取当前数据和之前的状态,将新数据和旧状态相加,生成新的状态。

window operations

功能

设置窗口大小和滑动窗口的间隔,动态获取流媒体的状态。

需要两个参数:窗口时长和滑动步长。

实现步骤

窗口时长:规定每次计算的时间范围。

滑动步长:规定每隔多久触发一次计算。

两者必须是采集周期大小的整数倍。

代码示例

java 复制代码
import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}

object WindowOperations {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("window")
    val ssc = new StreamingContext(sparkConf,Seconds(3))
    ssc.checkpoint("./ck")

    val lines = ssc.socketTextStream("node01",9999)
    val words = lines.flatMap(_.split(" "))
    val pairs = words.map((_,1))
    val wordCounts = pairs.reduceByKeyAndWindow((a:Int,b:Int)=>(a+b),Seconds(12),Seconds(6))
    wordCounts.print()

    ssc.start()
    ssc.awaitTermination()

  }
  }

运行结果

设置采集周期为三秒,窗口时长为12秒,滑动步长为6秒,进行词频统计。

输出操作

常见输出方式

打印在控制台上。

保存成文本文件。

保存成Java对象的序列化形式。

结合RDD进行输出。

用途

可以将数据写入外部数据库,如MySQL。

相关推荐
手可摘星辰7775 小时前
一次线上FlinkCDC异常排查复盘
大数据·flink
大大大大晴天5 小时前
Hudi技术内幕:Metadata Table原理与实践
大数据
大大大大晴天1 天前
Hudi技术内幕:深入解析Index索引机制
大数据
阿里云大数据AI技术1 天前
Flink Forward Asia 2026 深圳启幕:Agentic Streaming for AI,开启实时智能新范式
大数据·flink
SelectDB2 天前
阶跃星辰基于 SelectDB 构建 PB 级 Agent 可观测平台
大数据·数据库·aigc
大大大大晴天5 天前
Hudi技术内幕:RecordPayload到RecordMerger
大数据
SelectDB6 天前
秒级弹性、最高降本 70%:SelectDB Serverless 如何重塑云数仓资源效率
大数据·后端·云原生
WhoAmI6 天前
MapReduce框架原理解析一:InputFormat
大数据·hadoop
WhoAmI6 天前
MapReduce框架原理解析三:OutputFormat
大数据·hadoop
WhoAmI6 天前
MapReduce框架原理解析二:Shuffle
大数据·hadoop