1. 什么是SparkStreaming
SparkStreaming是Spark核心API的扩展,支持可扩展的,高通量,容错性的流式数据处理。在数据的处理过程中可以使用Spark MLlib中的机器学习算法。
数据来源支持:
- Kafka
- Flume
- Kinesis
- TCP sockets
数据的输出支持:
- 文件系统
- 数据库
- live dashBoard
SparkStreaming 的内部运行机制如下图所示:
SparkStreaming接收输入数据,将数据切割成批次,输送给Spark Engine处理。处理之后的结果也是批处理后的数据。
Spark Streaming提出了一个流式数据的抽象概念,Dstream( discretized stream )。Dstream是一系列的RDD。
2. 例子
import org.apache.spark._
import org.apache.spark.streaming._
import org.apache.spark.streaming.StreamingContext._
val conf = new SparkConf().setMaster("local[2]").setAppName("NetworkWordCount")
val ssc = new StreamingContext(conf, Seconds(1))
// Create a DStream that will connect to hostname:port, like localhost:9999
val lines = ssc.socketTextStream("localhost", 9999)
// Split each line into words
val words = lines.flatMap(_.split(" "))
val pairs = words.map(word => (word, 1))
val wordCounts = pairs.reduceByKey(_ + _)
// Print the first ten elements of each RDD generated in this DStream to the console
wordCounts.print()
ssc.start() // Start the computation
ssc.awaitTermination() // Wait for the computation to terminate
3. 基本概念
3.1 Linking (Maven)依赖
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.11</artifactId>
<version>2.4.0</version>
</dependency>
引入其他支持的依赖Artifact
source | Artifact |
---|---|
Kafka | spark-streaming-kafka-0-10_2.11 |
Flume | spark-streaming-flume_2.11 |
Kinesis | spark-streaming-kinesis-asl_2.11 [Amazon Software License] |
3.2 初始化 StreamingContext
3.2.1 新建
import org.apache.spark._
import org.apache.spark.streaming._
val conf = new SparkConf().setAppName(appName).setMaster(master)
val ssc = new StreamingContext(conf, Seconds(1))
3.2.2 从SparkContext中生成
import org.apache.spark.streaming._
val sc = ... // existing SparkContext
val ssc = new StreamingContext(sc, Seconds(1))
3.2.3 创建完StreamingContext 之后的操作
- 定义数据来源
- 定义数据的处理逻辑
- 开始接受数据。streamingContext.start()
- 等待执行结束。streamingContext.awaitTermination()
- 手动关闭。 streamingContext.stop()
3.2.4 提示
- 一旦context被创建,无法添加新的数据源
- 一旦context被停止,无法重新启动。
- JVM同一时间只能启动一个StreamingContext
- 停止SparkStreamingContext的同时,StreamingContext也被停止。如果只想停止StreamingContext,设置
stopSparkContext
为false - SparkContext可以重复使用创建多个StreamingContext。只要上一个StreamingContext在下一个StreamingContext创建之前关闭
3.3 DStreams
DStreams是一系列的RDD,每个RDD的数据包含指定的时间间隔。
在DStream上的操作会在每个RDD上进行:
3.4 Input DStreams 和 接收者
SparkStreaming 提供两类的数据源接口:
- 基本数据源:文件系统,socket
- 高级数据源:Kafka,Flume,Kinesis
提示:
- 不要使用“local” 或者“local[1]
- 分配给SparkStreaming 应用的核要大于接收者的数量,不然没有线程去处理数据。
3.4.1 基本数据源
1. 文件系统
streamingContext.textFileStream(dataDirectory)
文件夹是如何被监控的:
- 普通目录:hdfs://namenode:8040/logs/
- POSIX 模式匹配:hdfs://namenode:8040/logs/2017/*
- 所有数据的格式要保持一致
- 文件的时间序列取决于修改时间
- 当前时间窗口对文件的修改不会引起该文件被重新读取
- 目录下文件越多,扫描的时间越长,尽管没有文件更新
- hdfs://namenode:8040/logs/2016-*。重命名文件夹匹配这个规则,只有修改时间在当前的窗口内的文件才会被列入监控。
- 调用
FileSystem.setTimes()
会在下一个时间监控该文件,即使该文件的内容没有修改。