定义
SparkStreaming
是Spark
核心API
的扩展,类似与Apache Storm
,但是它不是真正的是实时的,它是准实时的,也就是单位时间内做小批量的处理,它是可伸缩的、高可用的、容错的、用来处理流式数据的。它能够从Kafka、Flume、Kinesis、TCP socket
中加载数据,加载进来的数据可以用map、reduce、join、window
等抽象函数进行处理,最后处理的结果数据可以Push
到外部的文件系统、数据库或者是实时的进行前端的展示。
架构模型
它的内部工作原理如下图所示,SparkStreaming
接受到数据流以后,然后输入数据会被分成批处理,最终交给Spark
引擎去处理,最终批量生成最终结果流。
SparkStreaming
使用的是"微批次"的结构,把流式计算分成一系列连续的小批次交由Spark
引擎处理。SparkStreaming
按照时间来划分批次,在单位时间内的数据会被划分在一个批次内,每个输入的批次都会形成一个RDD
,Spark
引擎其实就是处理这些RDD
的。批次的间隔时间是由参数指定的。高层次的架构图如图所示。
SparkStreaming
提供了一种离散流的或者DStream
的高级抽象,这种抽象代表了连续的数据流。DStream
可以从Kafka、Flume、Kinesis
等数据源来创建。DStream
内部其实就是一系列的RDD
。一个RDD
中的数据就是一个批次的数据
SparkStreaming
会为每个输入源启动对应的接收器,接收器以任务的形式运行在应用的Executor
中,它接受输入数据并保存为RDD
,并且以副本的形式再次保存在另一个Executor
中来保障容错。
SparkStreaming第一个程序
在Window
上的idea
上编写的程序,需要下载netcat
工具 https://eternallybored.org/misc/netcat/,下载以后解压到任何地方,并配置它的环境变量。然后在doc
窗口运行net.exe -l -p 9999
命令。
object StreamingTest {
def main(args: Array[String]): Unit = {
//初始化SparkConf
val conf = new SparkConf().setMaster("local[2]").setAppName("Streamingtest")
//初始化StreamingContext,并设置2秒一次批处理
val streaming = new StreamingContext(conf, Seconds(2))
//监控本机9999端口
val inputStream: ReceiverInputDStream[String] = streaming.socketTextStream("localhost", 9999)
//打印接受到输入数据
inputStream.print()
//开始执行
streaming.start()
//等待执行终止
streaming.awaitTermination()
}
}