文章目录
一、简介
Spark处理的是批量的数据(离线数据),Spark Streaming实际上是对接的外部数据流之后按照时间切分,批处理一个个切分后的文件,和Spark处理逻辑是相同的。
Dstream:Spark Streaming提供了表示连续数据流的、高度抽象的被称为离散流的DStream
假如外部数据不断涌入,按照一分钟切片,每个一分钟内部的数据是连续的(连续数据流),而一分钟与一分钟的切片却是相互独立的(离散流)。
DStream是Spark Streaming特有的数据类型。
Dstream可以看做一组RDDs,即RDD的一个序列:
将连续的数据持久化,离散化,然后进行批量处理。
持久化:接收到的数据暂存。做容错,当数据流出错了,因为没有得到计算,需要把数据从源头进行回溯,暂存的数据可以进行恢复。
离散化:按时间分片,形成处理单元。
分片处理:分批处理。
二、总结
park Streaming称之为微批处理
做这个微批处理主要体现在三个部分:1.数据的读取,2.数据的计算,3.计算结果 的输出
2.1.数据的读取:
Spark Streaming接收Kafka、Flume、HDFS等各种来源的实时输入数据,进行处理后,处理结构保存在HDFS、DataBase等各种地方。
2.1.数据的计算:
Spark Streaming将接收到的实时流数据,按照一定时间间隔,对数据进行拆分,交给Spark Engine引擎计算,最终得到一批批的结果
任何对DStream的操作都会转变为对底层RDD的操作(通过算子):
transformation 转换算子:
reduce,count算子不会直接触发Dstreami计算。
output 执行算子(输出算子):
· saveAsObjectFile、saveAsTextFile、saveAsHadoopFiles:将一批数据输出到Hadoop文件系统中,用批量数据的开始时间
戳来命名
· forEachRDD:允许用户对DStream的每一批量数据对应的RDD本身做任意操作
2.3.数据的写出:
通过Print、saveAsTextFile、saveAsHadoopFiles等输出算子进行计算结果的输出
(1)print()
:在运行流程序的驱动结点上打印DStream中每一批次数据的最开始10个元素。这用于开发和调试。
(2)saveAsTextFiles(prefix, [suffix])
:以text文件形式存储这个DStream的内容。每一批次的存储文件名基于参数中的prefix和suffix。res.saveAsTextFiles(“file:///f:/result/a”) (3)
saveAsObjectFiles(prefix,[suffix])`:以Java对象序列化的方式将Stream中的数据保存为 SequenceFiles . 每一批次的存储文件名基于参数中的为"prefix-TIME_IN_MS[.suffix]".
(4)foreachRDD(func)
:这是最通用的输出操作,即将函数 func 用于产生于 stream的每一个RDD。其中参数传入的函数func应该实现将每一个RDD中数据推送到外部系统,如将RDD存入文件或者通过网络将其写入数据库。注意:函数func在运行流应用的驱动中被执行,同时其中一般函数RDD操作从而强制其对于流RDD的运算。
三、简单应用之从不同数据源读取数据进行计算然后输出:
3.1从LINUX的一个端口中使用nc发送数据,然后读取
在IDEA中创建一个maven项目
导入依赖:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.4.3</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.11</artifactId>
<version>2.4.3</version>
</dependency>
编写测试代码:
object StreamWordCount {
def main(args: Array[String]): Unit =