一、概述
Spark Streaming是Spark Core功能拓展,可以实现数据流的可扩展、高吞吐、容错处理。SparkStreaming处理的数据可以来源于多种数据源(如:Kafka、Flume、TCP套接字),这些数据流经过流式计算的复杂处理和加工,最终会将计算的结果存储到文件系统、数据库或者在仪表盘进行数据的实时展示。
在内部,SparkStreaming会将接受的流数据拆分为一个个批次数据(micro batch),通过Spark引擎处理微批RDD,产生最终的结果流。
在Spark Streaming中有一个高等级的抽象称为离散流或者DStream。DStream可以通过外部的数据源构建或者转换获得新的DStream(类似于Spark RDD的使用);
结论:DStream底层是由Seq[RDD]序列构成
二、DStream离散流原理
DStream是Spark Streaming中最为核心的抽象,表现为一段连续的数据流(本质上是一组连续的RDD的序列集合),一个DStream中的一个RDD含有一个固定间隔的数据集。
应用在DStream上的任何操作底层都会转换为RDD的操作。
核心思想:微批 思想,底层使用spark rdd处理离散数据流
三、Input Source和Receivers
Input DStream表示从数据源接受的数据构建的DStream对象
构建Input DStream两种方式:
- basic source: 通常不依赖第三方的依赖可以通过ssc直接创建,如:filesystem和socket
- advanced source: 通常需要集成第三方依赖,如:kafka、flume其它流数据存储系统
basic source(基本数据源):
- 文件系统创建(使用HDFS API从任意的文件系统读取文件目录数据,作为DStream数据源)
// 通过文件系统构建DStream 注意:路径指向一个目录而不是一个具体的文件
val lines = ssc.textFileStream("hdfs://xxx:9000/data")
注意:
- 路径是一个目录,不是具体的文件
- 数据目录支持通配符,如:
hdfs://xxx:9000/data*
;- 数据文件格式必须保证统一,建议文本类型
- TCP Socket套接字
val lines = ssc.socketTextStream("localhost",8888)
- RDD Queue(RDD队列,可以将多个RDD存放到一个Queue队列中构建DStream)
// 注意:ssc中封装了sparkContext可以直接获取 无需手动创建
val rdd1 = ssc.sparkContext.makeRDD(List("Hello Spark","Hello Kafka"))
val rdd2 = ssc.sparkContext.makeRDD(List("Hello Scala","Hello Hadoop"))
// 通过Queue封装RDD,创建一个DStream
val queue = scala.collection.mutable.Queue(rdd1,rdd2)
val lines = ssc.queueStream(queue)
advanced source(高级数据源):
- 基于kafka
(1).导入依赖
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming-kafka-0-10_2.11</artifactId>
<version>2.4.4</version>
</dependency>
(2).开发应用
package source
import org.apache.kafka.clients.consumer.{
ConsumerConfig}
import org.apache.kafka.common.serialization.StringDeserializer
import org.apac