参考
https://blog.csdn.net/howard2005/article/details/124835239
一、流计算概述
流计算
是一种用于处理实时数据的计算模型。它可以在数据产生时立即进行处理,而不是等待数据被存储后再进行批量处理。流计算在许多应用中非常重要,如实时分析、监控、日志处理等。
静态数据、流数据
特点
实时处理、主动推送
大量、快速、时变、持续到达
低延迟、可扩展、高可靠
二、Spark Streaming
Spark Streaming
是Apache Spark生态系统中的一部分,它是用于流处理的引擎。它提供了高度抽象的DStream(离散流)API,允许你以批处理方式来处理实时数据流。Spark Streaming可以与许多数据源集成,包括Kafka、Flume、HDFS、套接字流等。
模仿流计算
Spark是以线程级别并行,实时响应级别高
可以实现秒级响应,变相实现高效的流计算
Spark Streaming是一个基于Spark Core之上的实时计算框架,可以从很多数据源消费数据并对数据进行处理。
三、DStream
DStream
是Spark Streaming的核心抽象,它代表了连续的数据流。DStream可以从各种数据源创建,然后通过一系列转换操作来处理和转换数据。常见的DStream操作包括map、reduceByKey、join等,这些操作会在数据流中应用到每个微批数据上。
在Spark Streaing中有一个最基本的抽象叫DStream(代理),本质上就是一系列连续的RDD,DStream其实就是对RDD的封装。
DStream可以任务是一个RDD的工厂,该DStream里面生产都是相同业务逻辑的RDD,只不过是RDD里面要读取数据的不相同
深入理解DStream:他是sparkStreaming中的一个最基本的抽象,代表了一下列连续的数据流,本质上是一系列连续的RDD,你对DStream进行操作,就是对RDD进行操作
DStream每隔一段时间生成一个RDD,你对DStream进行操作,本质上是对里面的对应时间的RDD进行操作
DSteam和DStream之间存在依赖关系,在一个固定的时间点,对个存在依赖关系的DSrteam对应的RDD也存在依赖关系,
每个一个固定的时间,其实生产了一个小的DAG,周期性的将生成的小DAG提交到集群中运行。
四、文件流操作
Spark Streaming支持从文件系统中读取流数据,这在一些场景中非常有用。你可以使用fileStream方法来创建一个DStream,然后指定文件夹路径和文件过滤器,以便从该文件夹中获取数据。
wordcount实例
object FileWordCount { def main(args: Array[String]): Unit = { // 创建Spark配置对象 val conf = new SparkConf() .setMaster("local[2]") .setAppName("FileWordCount") // 按照时间间隔为3秒钟切分数据流 val ssc = new StreamingContext(conf, Seconds(3)) // 创建行分段流,接收文件流 val lines = ssc.textFileStream("file:///user/local/logfile") // 生成单词分段流 val words = lines.flatMap(_.split(" ")) // 计算每一批次中的每个单词数量,并进行词频统计 val wc = words.map(x=>(x,1)).reduceByKey(_+_) // 输出分段流中每个RDD的词频统计结果 wc.print() // 开始计算 ssc.start() // 等待计算结束 ssc.awaitTermination() } }
创建StreamingContext对象
五、套接字流
套接字流是通过套接字连接来接收数据流的一种方式。你可以使用socketTextStream方法创建一个套接字DStream,指定主机和端口。
from pyspark.streaming import StreamingContext ssc = StreamingContext(sparkContext, batchDuration) lines = ssc.socketTextStream("localhost", 9999)
你可以在套接字流上执行与文件流相同的操作,例如map、reduceByKey等。
六、实时处理示例
下面是一个使用Spark Streaming进行简单实时处理的示例:
from pyspark.streaming import StreamingContext ssc = StreamingContext(sparkContext, 1) # 创建StreamingContext,批处理间隔为1秒 lines = ssc.socketTextStream("localhost", 9999) # 创建套接字流 # 对DStream进行转换和操作 wordCounts = lines.flatMap(lambda line: line.split(" ")).map(lambda word: (word, 1)).reduceByKey(lambda a, b: a + b) wordCounts.pprint() # 打印每批次的结果 ssc.start() # 启动流处理 ssc.awaitTermination() # 等待流处理终止
这个示例从套接字流接收数据,对数据进行分词、计数,并打印每批次的结果。
Spark Streaming是一个功能强大的流处理引擎,它可以用于实时数据分析、监控、实时报警等各种实时应用。希望本文能够帮助你了解Spark Streaming的基础概念和使用方式。