SparkStreaming概述
1、简介
SparkStreaming作为Spark的核心API的扩展,同时SparkStreaming具有很强大的特性:
1、高扩展性
2、高吞吐性
3、高容错性
4、实时数据处理(micro batch processing)
数据能从多种不同的数据源注入到SparkStreaming,常用的数据源有:
Kafka
Flume
Kenesis
TCP socket
File
同时SparkStreaming提供了许多高级API算子,可以实现底层用复杂的算法处理数据,最后,处理后的数据可以传输到文件系统、数据库、实时报表(仪表盘dashboards)
,同时我们还可以运用Spark的Machine Learning & 图处理算法来针对DStream进行数据分析,Spark的架构定位图如下:
SparkStreaming 接受实时输入的数据流然后将数据切分成不同的批次,然后经过Spark引擎将结果数据以batch的形式生成最后的流,示意图如下
简单的使用代码
object SparkStreamingDemo {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setAppName("sparkStreaming").setMaster("local[2]")
val ssc = new StreamingContext(conf, Seconds.apply(5))
//从文件读取配置,Properties可以使用scala中的Source类进行代替
val properties = new Properties()
properties.load(this.getClass.getClassLoader.getResourceAsStream("socket.properties"))
val hostname: String = properties.getProperty("hostname", "localhost")
val port: Int = properties.getProperty("port", "9999").toInt
val ds: ReceiverInputDStream[String] = ssc.socketTextStream(hostname, port, StorageLevel.MEMORY_ONLY)
ds.print()
//开始计算
ssc.start()
//等待计算终止,任务结束才结束
ssc.awaitTermination()
}
}
2、初始化StreamingContext
初始化一个StreamingContext是整个SparkStreamingAPI的入口,所以首先得初始化该实例
import org.apache.spark.streaming._
//1、从配置进行初始化
val conf: SparkConf = new SparkConf().setAppName("Streaming Demo").setMaster("local[2]")
var ssc = new StreamingContext(conf, Seconds(10))
//2、从SparkContext进行初始化
val sc = new SparkContext(conf)
ssc = new StreamingContext(sc,Seconds(10))
ssc.start()
//TODO SOMETHING
ssc.awaitTermination()
ssc.stop()//手动停止进程,配合开启相关的gentle.stop配置使用
需要被牢记的几个点
一旦一个StreamingContext启动,其它的streaming计算都不能添加到该上下文中
一旦一个StreamingContext被停止,那么它不能重启
一个JVM中在同一时间内只能有一个StreamingContext属于active状态
stop()方法会同时stop掉SparkContext,如果仅仅只需要stopStreamingContext,我们需要添加相关的选项参数 stopSparkContext为=>false
一个SparkContext能被用于创建多个StreamingContext实例,只要lastStreamingContext is stoped 但是 SparkContext没有被stop
3、SparkStreaming API抽象DStream
sparkcore的抽象是RDD,SparkSQL的抽象是DataSet、DataFrame,所以SparkStreaming提供了自己的数据结构抽象DStream
【离散流】,它表示连续的数据流,DStream由一系列连续的RDD表示,DStream中的每个RDD都包含来自特定时间间隔的数据
在DStream上的任何操作都可以转换成对基础RDD的操作如下图: