定义
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()
}
}