Spark Streaming原理介绍

Spark Streaming简介

Spark Streaming是Spark 核心API的一个扩展,可以实现高吞吐量的、具备容错机制的 实时流数据的处理。支持从多种数据源获取数据,包括Kafk、Flume、Twitter、ZeroMQ、Kinesis以及TCP sockets,从数据源获取数据之后,可以使用诸如 map、reduce、join和window等高级函数进行复杂算法的处理。最后还可以将处理结果存储到文件系统,数据库和现场仪表盘。

Spark Streaming处理的数据流图:

Spark Streaming原理介绍_第1张图片
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。

Spark Streaming原理介绍_第2张图片

代码实例:

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

你可能感兴趣的:(Spark Streaming原理介绍)