1、概念
在介绍spark的时候我们就介绍过他的一些架构,是基于sparkcore且可以附加各种工具的,sparkstreaming就是其中的工具之一,其概念和spark的RDDs比较类似,他是使用离散化流作为抽象表示出一个DStream的概念,这个DStream就是随时间推移而得到的数据的一个离散化序列。
如图所示,随着时间的推移,会有不同的数据产生,而DStream就会根据设定,每隔一段时间就读取一次数据,这是有一个时间周期的,然后在一个周期内DStream将数据送至Driver中变成一个RDD,最后送到执行器中变成一个executor。
2、架构及工作流程
3、IDEA的简单应用
3.1环境搭建
我们使用上次教过的项目文件就可以,没有的可以自己新建一个maven项目,具体配置攻略:
https://blog.csdn.net/qq_40343117/article/details/101158794
然后我们打开pom.xml文件加入一段关于streaming的代码。
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
3.2项目实操
新建一个scala项目,开始操作:
实现问题:读取虚拟机h01的9999端口的消息
完整代码:
package Streaming
import org.apache.spark.streaming.dstream.{DStream, ReceiverInputDStream}
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.streaming.{Duration, Seconds, StreamingContext}
object Streaming01_WWordCount{
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("Streaming").setMaster("local[*]")
val streamingContext = new StreamingContext(conf,Seconds(5))
val socketDstream:ReceiverInputDStream[String] = streamingContext.socketTextStream("h01",9999)
val wordDtream:DStream[String] = socketDstream.flatMap(line => {
line.split(" ")
})
val mapDstream:DStream[(String,Int)] = wordDtream.map((_,1))
val wordToSumDstream:DStream[(String,Int)] = mapDstream.reduceByKey(_+_)
wordToSumDstream.print()
streamingContext.start()
streamingContext.awaitTermination()
}
}
代码分布解析:
- 1.配置对象
// spark配置对象
val conf = new SparkConf().setAppName("Streaming").setMaster("local[*]")
// 实时数据分析环境对象
// 采集周期:指定时间为周期采集数据,原来是duration,他自己封装了seconds/minutes。。。。。
val streamingContext = new StreamingContext(conf,Seconds(5))
- 2.采集数据
// 从指定端口采集数据
// String意思是一行一行的数据
val socketDstream:ReceiverInputDStream[String] = streamingContext.socketTextStream("h01",9999)
- 3.数据处理
// 将采集的数据进行拆分(扁平化处理)
val wordDtream:DStream[String] = socketDstream.flatMap(line => {
line.split(" ")
})
// 将数据进行结构转变,方便统计分析
val mapDstream:DStream[(String,Int)] = wordDtream.map((_,1))
// 将结构化数据进行聚合处理
val wordToSumDstream:DStream[(String,Int)] = mapDstream.reduceByKey(_+_)
- 4.数据结果
// 结果打印
wordToSumDstream.print()
// 流式处理必备!!!
// 不能停止采集数据,所以不能使用stop
// 不让main方法跳出,要和采集器绑定,只有采集器停止,才停止
// 启动采集器
streamingContext.start()
// Driver等待采集器运行
streamingContext.awaitTermination()
运行结果展示
我们首先在虚拟机输入nc -lk 9999
连接至9999端口,注意这里的虚拟机和端口号要与代码对应
在IDEA中运行代码
等待一会之后会出现这个显示时间的东西,然后我们在虚拟机中向端口按代码规定的格式输入信息(按空格分隔)
成功读取到了信息,注意启动完了代码再向端口发送消息才可以。