文章目录
- 1.SparkStreaming简介
- 1.1 流处理和批处理
- 1.2 实时和离线
- 1.3 SparkStreaming是什么
- 1.4 SparkStreaming架构图
- 2.背压机制
- 3.DStream案例实操
1.SparkStreaming简介
1.1 流处理和批处理
流处理和批处理是两种不同的数据处理方式,它们在处理数据的方式和特点上有所不同。
流处理(Stream Processing)是一种数据处理方式,它实时地处理数据流,即将源源不断的数据按照特定的规则进行实时处理。
批处理(Batch Processing)是一种数据处理方式,它将一段时间内的数据收集起来,然后一次性地进行处理。
1.2 实时和离线
实时和离线是数据处理中的两种不同方式,它们在处理速度和数据类型上有所区别。
实时处理是指数据处理的速度能够满足实时要求,通常是指对数据进行的处理能够在相应的时间内产生结果,并且结果能够及时反馈给用户或应用系统。实时处理通常用于需要快速响应的应用场景,如实时监控、实时交易等。
离线处理则是指数据处理的速度相对较慢,通常需要较长时间才能完成,而且不需要实时反馈结果。离线处理通常用于处理大规模的数据集,如数据分析、机器学习等。离线处理可以在非实时环境中进行,例如在晚上或者周末等时间进行批量数据处理。
实时一般来说以毫秒为单位,不可与流处理混为一谈,而离线相对来说是以时、天为单位。
1.3 SparkStreaming是什么
Spark Streaming是构建在Spark上的实时计算框架,扩展了Spark处理大规模流式数据的能力。但是SparkStreaming不能做到真正意义上的实时计算,实际上它是一种准实时(秒,分钟),微批次的数据处理框架。 它将连续不断的数据按固定的时间间隔进行切分,使其变为一个个连续的批次,进而按顺序对每一个批次进行处理。一般情况下,每一个批次都会很小,这就是微批次。Spark Streaming的目的是为了进行实时数据分析,但因为一批数据量比较小,又达不到离线的范畴,所以称为准实时。
SparkStreaming用于流式数据的处理,Spark Streaming 支持的数据输入源很多,例如:Kafka、Flume、Twitter、ZeroMQ 和简单的 TCP 套接字等等。结果也能保存在很多地方,如 HDFS,数据库等。
1.4 SparkStreaming架构图
和 Spark 基于 RDD 的概念很相似,Spark Streaming 使用离散化流(discretized stream)作为抽象表示,叫作 DStream。 DStream 是随时间推移而收到的数据的序列。在内部,每个时间区间收到的数据都作为 RDD 存在,而 DStream 是由这些 RDD 所组成的序列(因此得名“离散化”)。所以简单来讲,DStream 就是对 RDD 在实时数据处理场景的一种封装。
在SparkStreaming中,会有一个专门接收器来接受从数据源输入的数据,并且将这些数据封装成离散化流(DStream)。之后的操作就是对DStream进行处理的。简单来讲,DStream就是对一系列RDD的封装。
2.背压机制
Spark 1.5 以前版本,用户如果要限制 Receiver 的数据接收速率,可以通过设置静态配制参数“spark.streaming.receiver.maxRate”的值来实现,此举虽然可以通过限制接收速率,来适配当前的处理能力,防止内存溢出,但也会引入其它问题。比如:producer 数据生产高于 maxRate,当前集群处理能力也高于 maxRate,这就会造成资源利用率下降等问题。为了更好的协调数据接收速率与资源处理能力,1.5 版本开始 Spark Streaming 可以动态控制数据接收速率来适配集群数据处理能力。背压机制(即 Spark Streaming Backpressure): 根据JobScheduler 反馈作业的执行信息来动态调整 Receiver 数据接收率。通过属性“spark.streaming.backpressure.enabled”来控制是否启用 backpressure 机制,默认值false,即不启用。
3.DStream案例实操
需求:实现WordCount 案例
使用 netcat 工具向 9999 端口不断的发送数据,通过 SparkStreaming 读取端口数据并统计不同单词出现的次数
Netcat(简称nc)是一款强大的命令行网络工具,用来在两台机器之间建立TCP/UDP连接,并通过标准的输入输出进行数据的读写。netcat下载地址https://eternallybored.org/misc/netcat/
def main(args: Array[String]): Unit = {
//1.初始化 Spark 配置信息
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("StreamWordCount")
//2.初始化 SparkStreamingContext
//处理区间为3s一次
val ssc = new StreamingContext(sparkConf, Seconds(3))
//3.通过监控端口创建 DStream,读进来的数据为一行行
val lines = ssc.socketTextStream("localhost", 9999)
//将每一行数据做切分,形成一个个单词
val words = lines.flatMap(_.split(" "))
val wordMap = words.map(word => (word, 1))
val resultData = wordMap.reduceByKey(_ + _)
resultData.print()
//启动SparkStreamingContext
ssc.start()
//等待接收数据
ssc.awaitTermination()
}