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。

相关推荐
csdn56597385015 分钟前
MaxCompute MaxFrame | 分布式Python计算服务MaxFrame(完整操作版)
分布式·python·odps·maxframe
FreeBuf_2 小时前
无恶意软件勒索:Storm-0501如何转向云原生攻击
大数据·云原生·storm
爱思德学术3 小时前
中国计算机学会(CCF)推荐学术会议-B(数据库/数据挖掘/内容检索):EDBT 2026
大数据·数据库·数据管理
三不原则4 小时前
Kafka入门指南:从安装到集群部署
分布式·kafka
鹧鸪云光伏6 小时前
鹧鸪云软件如何重塑光伏电站管理与降本增效
大数据·运维·光伏·光伏设计
拾忆,想起7 小时前
Redis红锁(RedLock)解密:分布式锁的高可用终极方案
java·数据库·redis·分布式·缓存·性能优化·wpf
九河云7 小时前
科技守护古树魂:古树制茶行业的数字化转型之路
大数据·人工智能·科技·物联网·数字化转型
武子康7 小时前
大数据-82 Spark 集群架构与部署模式:核心组件、资源管理与调优
大数据·后端·spark
it_czz7 小时前
Flink Redis广播方案
大数据·redis·flink
Apache Flink7 小时前
抖音基于Flink的DataOps能力实践
大数据·flink·dubbo