Spark Streaming简介
Spark Streaming是Spark 核心API的一个扩展,可以实现高吞吐量的、具备容错机制的 实时流数据的处理。支持从多种数据源获取数据,包括Kafk、Flume、Twitter、ZeroMQ、Kinesis以及TCP sockets,从数据源获取数据之后,可以使用诸如 map、reduce、join和window等高级函数进行复杂算法的处理。最后还可以将处理结果存储到文件系统,数据库和现场仪表盘。
Spark Streaming处理的数据流图:
Spark Streaming在内部的处理机制是:接收实时流的数据,并根据一定的时间间隔拆分成一批批的数据,然后通过Spark Engine处理这些批数据,最终得到处理后的一批批结果数据。
Spark Streaming运行原理
计算流程:
Spark Streaming 是将流式计算分解成一系列短小的批处理作业,也就是把输入数据按照batch size(如1秒)分成一段一段的数据(DStream),每一段数据都转换成Spark中的RDD,然后将对DStream的Transformation操作变为针对Spark中对 RDD的Transformation操作,将RDD经过操作变成中间结果保存在内存中。
编程模型:
DStream作为Spark Streaming的基础抽象,它代表持续性的数据流。这些数据流既可以通过外部输入源赖获取,也可以通过现有的Dstream的 transformation操作来获得。在内部实现上,DStream由一组时间序列上连续的RDD来表示。每个RDD都包含了自己特定时间间隔内的数据流。如图所示:
对DStream中数据的各种操作也是映射到内部的RDD上来进行的,如图所示,对DStream的操作可以通过 RDD 的transformation生成新的DStream。
代码实例:
import org.apache.spark._
import org.apache.spark.streaming._
val conf = new SparkConf().setMaster(“local[*]”).setAppName(“test")
val ssc = new StreamingContext(conf, Seconds(1))
val lines = ssc.socketTextStream("localhost", 9999)
val words = lines.flatMap(_.split(" “))
val pairs = words.map(word => (word, 1))
val wordCounts = pairs.reduceByKey(_ + _)
wordCounts.print()
ssc.awaitTermination()
StreamingContext为入口,DStream transformation构造出了lines->words->pairs->wordCounts->print()这样一个DStreamGraph,start() 将在幕后启动JobScheduler, 进而启动JobGenerator和ReceiverTracker,开始不断生成一个一个batch