大数据 -- Spark Streaming

原理

  1. Spark Streaming的原理与微积分的思想很类似,本质上是将一个连续的问题转换成无限个离散的问题
  2. Spark Streaming用时间片拆分了无限的数据流,然后对每个数据片采用类似批处理的方法进行处理
  3. Spark Streaming提供了对流数据的抽象DStream
    • DStream可以由来自Kafka、Flume、HDFS的流数据生成,也可以由别的DStream经过各种转换得到
  4. 底层DStream是由很多序列化的RDD构成,按时间片切分成的每一个数据单位都是一个RDD
    • Spark核心引擎对DStream的Transformation操作 -> Spark中对RDD的Transformation操作
    • 将RDD经过操作变成中间结果保存在内存
  5. DataFrame和DataSet都是基于RDD的,因此RDD是Spark最基本的数据抽象,类似于Java中的基本数据类型
    • 因此,无论DataFrame、DataSet,还是DStream,都具有RDD的不可变性、分区性和容错性
  6. Spark是一个高度统一的平台,所有高级API都具有相同的性质,它们之间很容易地相互转换
    • Spark的野心:用一套工具统一所有数据处理的场景

DStream

内部形式

DStream的内部形式是一个连续的RDD序列,每个RDD代表一个时间窗口的输入数据流

转换

1
2
3
4
sc = SparkContext(master, appName)
ssc = StreamingContext(sc, 1)
lines = sc.socketTextStream("localhost", 9999)
words = lines.flatMap(lambda line: line.split(" "))
  1. 创建一个lines的DStream,去监听来自本机9999端口的数据流,每个数据代表一行文本
  2. 然后对lines进行flatMap的转换操作,把每一个文本行拆分成词语
  3. 对一个DStream进行flatMap操作
    • 本质上就是对它里面的每一个RDD进行flatMap操作,生成一系列新的RDD,构成一个新的代表词语的DStream
  4. RDD支持的所有转换操作,DStream都支持,DStream还支持一些特有操作,如滑动窗口操作

滑动窗口

  1. 任何Spark Streaming的程序都要先创建一个StreamingContext对象,它是所有Streaming操作的入口
  2. StreamingContext中最重要的参数是批处理的时间间隔,即把流数据细分成数据块的粒度,决定了流处理的延迟性
  3. 样例:每隔10秒输出过去60秒内排名前十的热点词
  4. 滑动窗口操作的两个基本参数
    • 窗口长度(window length):每次统计的数据的时间跨度
    • 滑动间隔(sliding interval):每次统计的时间间隔
  5. Spark Streaming流处理的最小时间单位是StreamingContext的时间间隔,窗口长度和滑动间隔是时间间隔的整数倍
  6. 最基本的滑动窗口操作是window,可以返回一个新的DStream,该DStream中的每个RDD代表一段时间窗口内的数据
1
2
// 每一个数据块都包含过去60秒的词语,这样的数据块会每10秒钟生成一个
windowed_words = words.window(60, 10)

优缺点

  1. 优点
    • 底层是基于RDD实现的,能体现RDD的优良特性
      • 数据容错性:如果RDD的某些分区丢失了,可以通过依赖信息重新计算恢复
      • 运算速度:同样可以通过persist方法将数据流存放在内存中,在需要多次迭代计算时,速度优势明显
    • Spark Streaming是Spark生态的一部分,可以与Spark的核心引擎、Spark SQL、MLib等无缝衔接
      • 对Spark Streaming实时处理出来的中间数据,可以立即在程序中无缝进行批处理、交互式查询等操作
      • 这大大增强了Spark Streaming的优势和功能,使得基于Spark Streaming的应用程序的扩展性很好
  2. 缺点
    • 主要缺点是实时计算延迟较高,一般在级别,这是因为Spark Streaming不支持太小的批处理的时间间隔
    • Spark Streaming是一个准实时系统,而Storm的延迟可以做到毫秒
0%