Spark-Streaming核心编程(四)总结

有状态转化操作 - UpdateStateByKey

‌功能描述 ‌

UpdateStateByKey原语用于在DStream中跨批次维护状态,例如流计算中的累加wordcount。

它允许对一个状态变量进行访问和更新,适用于键值对形式的DStream。

‌工作原理 ‌

给定一个由(键,事件)对构成的DStream,并传递一个指定如何根据新的事件更新每个键对应状态的函数。

构建出一个新的DStream,其内部数据为(键,状态)对。

‌使用步骤 ‌

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

定义状态更新函数:使用此函数阐明如何使用之前的状态和来自输入流的新值对状态进行更新。

配置检查点目录:updateStateByKey需要使用检查点来保存状态。

‌示例代码 ‌

scalaCopy Code

val updateFunc = (values: SeqInt, state: OptionInt) => {

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.updateStateByKeyInt](updateFunc)

stateDStream.print()

ssc.start()

ssc.awaitTermination()

窗口操作 - Window Operations

‌功能描述 ‌

窗口操作允许设置窗口的大小和滑动窗口的间隔,以动态地获取当前Streaming的状态。

‌参数说明 ‌

窗口时长:计算内容的时间范围。

滑动步长:触发计算的间隔。

这两者都必须为采集周期大小的整数倍。

‌示例代码 ‌

scalaCopy Code

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()

DStream 输出操作

‌输出操作的重要性 ‌

输出操作指定了对流数据经转化操作得到的数据所要执行的操作。

与RDD中的惰性求值类似,如果没有执行输出操作,DStream将不会被求值。

‌常见的输出操作 ‌

print():在驱动结点上打印DStream中每一批次数据的最开始10个元素,用于开发和调试。

saveAsTextFiles(prefix, suffix):以text文件形式存储DStream的内容。

saveAsObjectFiles(prefix, suffix):以Java对象序列化的方式存储数据。

saveAsHadoopFiles(prefix, suffix):将数据保存为Hadoop文件。

foreachRDD(func):最通用的输出操作,对DStream中的每个RDD运行任意计算。可以将数据推送到外部系统,如MySQL数据库。

‌使用注意事项 ‌

连接操作不能写在driver层面(序列化问题)。

避免在foreach中对每个RDD中的每条数据都创建连接,效率较低。

可以使用foreachPartition在分区层面创建连接。

相关推荐
howdoyoudo2026063 小时前
AI审计手记 #28:从“暂停训练”到“切断联网”——AI安全控制手段的极限升级
大数据·人工智能·安全·ai·语言模型
曦夜日长8 小时前
Git系统篇,Git本地使用(一):从“究极进化版“到三个区域的底层原理
大数据·linux·git·elasticsearch
阿明副业观察8 小时前
2026年免费AI视频生成工具功能深度解析:有无水印、中文语音及商业用途考量
大数据·人工智能·ai作画·aigc·音视频·ai写作
2601_9627809110 小时前
2027校招准备:统计学专业如何用数据能力应聘企业经营管理管培生
大数据
阿明副业观察10 小时前
AI视频生成技术全解:生成方法、操作流程与选型指南
大数据·人工智能·ai作画·aigc·ai写作
Leo.yuan12 小时前
FineBI AI原生版:Agent主动规划分析路径,让数据成为企业经营决策的顾问
大数据
VibeCoding工程之道12 小时前
第八章 最终格局:不是 AI 淘汰人,是「依赖 AI 的人」淘汰自己
大数据·人工智能·ai焦虑·ai思考·ai反噬
大大大大晴天13 小时前
每天认识一个组件:Apache Kafka
大数据
2501_9336707913 小时前
2027秋招岗位能力分组:数据科学与大数据技术专业如何组织技能与项目
大数据