许多应用需要即时处理收到的数据,例如用来实时追踪页面访问统计的应用,训练机器学习的模型的应用,还有自动检测异常的应用。
Spark Streaming是Spark为这些应用而设计的模型。它允许用户使用一套和批处理非常接近的API来编写流式计算应用,这样就可以大量重用批处理应用的技术甚至代码。

Spark Streaming使用离散化流(discretized stream)作为抽象表示,叫作DStream。DStream时随时间推移而收到的数据的序列。在内部,每个时间区间收到的数据都作为RDD存在,而在DStream是有这些RDD组成的序列。
DStream可以从各种输入源创建,比如Flume、Kafka、或者HDFS。
创建出来的DStream支持两种操作:转化操作和输出操作。
转化操作会生成一个新的DStream。输出操作可以把数据写入外部系统中。DStream提供了许多与RDD所支持的操作相似的操作支持,还增加了与时间相关的新操作,比如滑动窗口。

和批处理不同,Spark Streaming应用需要进行额外配置来保证24/7不间断工作。检查点机制就是Spark Streaming用来实现不间断工作的主要方式。

架构与抽象

Spark Streaming使用“微批次”的架构,把流式计算当作一系列连续的小规模批处理来对待。Spark Streaming从各种输入源中读取数据,并把数据分组为小的批次。新的批次按均匀的时间间隔创建出来。在每个时区开始的时候,一个新的批次就创建出来,在改区间收到的数据都会被添加到这个区间中。在时间区间结束时,批次停止增长。
时间区间的大小是由批次间隔这个参数决定的。批次间隔一般设在500毫秒到几秒之间,由应用开发者配置。
每个输入批次都形成一个RDD,以Spark作业的方式处理并生成其他的RDD。处理的结果可以以批处理的方式传给外部系统。
😎😎😎


Spark Streaming为每个输入源启动对应的接收器。接收器以任务的形式运行在应用的执行器进程中,从输入源收集数据并保存为RDD。他们收集到输入数据后会把数据复制到另一执行器进程来保障容错性(默认行为)。
数据保存在执行器的进程的内存中,和缓存RDD的方式一样。驱动器程序中的StreamingContext会周期地运行Spark作业来处理这些数据,把数据与之前时间区间中的RDD进行整合。

Spark Streaming对DStream提供的容错性与Spark为RDD所提供的容错性一致:只要输入数据还在,他就可以使用RDD谱系重算出任意状态(比如重新执行处理输入数据的操作)。默认情况下,收到的数据分别存在于两个节点上,这样Spark可以容忍一个工作节点的故障。不过,如果只用谱系来恢复的花,重算有可能会花很长时间,因为需要处理从程序启动以来的所有数据。因此,Spark Streaming提供了检查点机制,可以把状态阶段性的存储到可靠文件系统中。一般,每处理5-10个批次数据就保存一次,在数据恢复时,只需要回溯到上一个检查点即可。