流处理

  1. Spark SQL 中的 DataFrame API 和 DataSet API 都是基于批处理模式对静态数据进行处理
  2. 2013,Spark 的流处理组件 Spark Streaming 发布,现在的 Spark Streaming 已经非常成熟,应用非常广泛

原理

  1. Spark Streaming 的原理与微积分的思想很类似
    • 微分是无限细分,而积分是对无限细分的每一段进行求和
    • 本质 - 将一个连续的问题转换成了无限个离散的问题
  2. 流处理的数据是一系列连续不断变化,且无边界的,永远无法预测下一秒的数据
  3. Spark Streaming 用时间片拆分了无限的数据流
    • 然后对每个数据片用类似于批处理的方法进行处理,输出的数据也是分块

image-20241118165318271

  1. Spark Streaming 提供一个对于流数据的抽象 DStream
  2. DStream 可以由 KafkaFlume 或者 HDFS 的流数据生成,也可以由别的 DStream 经过各种转换操作得到
  3. 底层 DStream 由多个序列化的 RDD 构成,按时间片(如一秒)切分成的每个数据单位都是一个 RDD
  4. Spark 核心引擎将对 DStreamTransformation 操作变为针对 Spark 中对 RDDTransformation 操作
    • 将 RDD 经过操作变成中间结果保存在内存
  5. Spark SQL 中的 DataFrameDataSet 同样基于 RDD - Spark 最基础的数据抽象 - Java Primitive Type
    • 无论是 DataFrame、DataSet、DStream,都具有 RDD不可变性分区性容错性等特性
  6. Spark 是一个高度统一的平台
    • 所有的高级 API 都具有相同的性质,相互之间很容易转化
    • 野心 - 用一套工具统一所有数据处理的场景
  7. Spark Streaming 将底层细节封装起来,对开发者来说,只需要操作 DStream 即可

DStream

一个连续的 RDD 序列,每个 RDD 代表一个时间窗口的输入数据流

image-20241118171041623

DStream转换操作,将对它所包含的每一个 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

image-20241118171920714

RDD 支持的所有的转换操作,DStream 都支持,但 DStream 还支持一些特有操作,如滑动窗口操作

滑动窗口

  1. 任何 Spark Streaming 程序都需要首先创建一个 StreamingContext 对象,是所有 Streaming 操作的入口
    • 可以通过 StreamingContext 创建 DStream
  2. StreamingContext 中最重要的参数是批处理的时间间隔,即把流数据细分成数据块粒度
    • 该时间间隔决定了流处理延迟性 - 需要根据需求资源来衡量间隔的长度
  3. 滑动窗口 - 每隔一段时间,统计过去某个时间段内的数据
    • 每隔 10 秒,输出过去 60 秒内排名前十的热点词
  4. 滑动窗口的基本参数
    • 窗口长度(window length) - 每次统计的数据的时间跨度
    • 滑动间隔(sliding interval)- 每次统计的时间间隔
  5. 由于 Spark Streaming 流处理的最小时间单位StreamingContext时间间隔
    • 因此滑动窗口的两个参数都是 StreamingContext 时间间隔整数倍

image-20241118174046684

最基本的滑动窗口操作是 window,返回一个新的 DStream,其中的 RDD 代表一段时间窗口内的数据

1
windowed_words = words.window(60, 10)
  1. windowed_words 代表的是热词统计所需要的 DStream
  2. 里面每一个数据块都包含过去 60 秒内的词语,这样的数据块每 10 秒生成一个

优缺点

优点

  1. 底层基于 RDD 实现,能复用 RDD 的优良特性(如数据容错性、运行速度等)
  2. Spark Streaming 是 Spark 生态的一部分,可以与 Spark 核心引擎Spark SQLMLlib无缝衔接

缺点

  1. Spark Streaming 的主要缺点是实时计算延迟较高,一般在秒级
    • 因为 Spark Streaming 不支持太小的批处理的时间间隔
  2. Spark Streaming 是一个准实时系统 - Apache Storm 可以做到毫秒级