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。

相关推荐
码熔burning34 分钟前
【MQ篇】RabbitMQ之消费失败重试!
java·分布式·rabbitmq·mq
灵途科技42 分钟前
NEPCON China 2025 | 具身智能时代来临,灵途科技助力人形机器人“感知升级”
大数据·人工智能
sky.fly1 小时前
思科路由器重分发(静态路由+OSPF动态路由+RIP动态路由)
大数据·网络·智能路由器
阿里云大数据AI技术1 小时前
演讲实录:中小企业如何快速构建AI应用?
大数据·人工智能·云计算
咦!一只菜鸡2 小时前
idea连接远程服务器kafka
分布式·学习·kafka
〆、风神2 小时前
从零实现分布式WebSocket组件:设计模式深度实践指南
分布式·websocket·设计模式
凉白开3383 小时前
spark总结
大数据·分布式·spark
等雨季3 小时前
Spark总结
大数据·分布式·spark
xυlai3 小时前
Spark-Streaming
大数据·分布式·spark
神奇的黄豆3 小时前
Spark-Streaming核心编程(四)总结
大数据·spark