Spark Streaming
http://spark.apache.org/docs/latest/streaming-programming-guide.html#overview
Spark Streaming是Spark Core的进一步扩展,可以实现数据流的可扩展、高吞吐、容错处理。Spark Streaming处理的数据可以来源于多种方式,比如Kafka、Flume、Kinesis或者TCP传输等,这些流数据经过Spark Streaming进行复杂的处理加工。最终,将处理的结果保存到文件系统、数据库或者实时的展示界面。
Spark Streaming的工作原理
Spark Streaming接受实时的数据流并将数据流拆分为一个一个的批次(micro batch),通过Spark引擎处理(rdd),产生最终的结果流
实际上:流处理转批处理的过程
Spark提供了高等级的抽象,称为离散流或者DStream
(DStream表现为连续的数据流)。DStream一般是通过输入的数据流进行构建(如:kafka、Flume、Kinesis)或者其它的DStream。实际上在内部,一个DStream
表现为一组RDD的序列
什么是流数据?什么事批数据?
流数据:类似于水流,没有范围和界限。表现为有起始,但没有终止。
批数据:有范围的数据,范围可以是一个小时、一天、一个月等,也就是数据有起始,有终止
第一个Spark Streaming例子
单词计数(TCP数据服务器的访问数据)
导入Spark Streaming依赖
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.11</artifactId>
<version>2.4.4</version>
<scope>provided</scope>
</dependency>
注意:数据源如果是kafka、flume、kinesis等类型,需要额外引入
spark-streaming-xyz_2.12
依赖
测试代码
package example1
import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}
object QuickExample {
def main(args: Array[String]): Unit = {
// StreamingContext是所有Spark Streaming应用的入口
val conf = new SparkConf().setMaster("local[2]").setAppName("quick example")
val ssc = new StreamingContext(conf, Seconds(5))
// 通过TCP Source创建DStream对象
val lines = ssc.socketTextStream("spark", 9999)
// 将此DStream中生成的每个RDD的前十个元素打印到控制台
lines.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _).print()
// 启动计算
ssc.start()
// 等待计算终止
ssc.awaitTermination()
}
}
安装Netcat,获取绑定端口的访问数据
[root@Spark spark-2.4.4]# yum install -y nc
运行Spark Streaming应用,并通过Netcat发送测试数据
[root@Spark spark-2.4.4]# nc -lk 4444
Hello Scala
Hello Hadoop
Hello Hadoop
Hello Hadoop
Hello Hadoop
Hello Hadoop
测试结果
-------------------------------------------
Time: 1562123560000 ms
-------------------------------------------
(Hello,1)
(Wolrd,1)
-------------------------------------------
Time: 1562123595000 ms
-------------------------------------------
(Hello,1)
(Spark,1)
Time: 1562123600000 ms
-------------------------------------------
(Hello,1)
(Scala,1)