流处理

  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 可以由 Kafka、Flume 或者 HDFS 的流数据生成,也可以由别的 DStream 经过各种转换操作得到
  3. 底层 DStream 由多个序列化的 RDD 构成,按时间片(如一秒)切分成的每个数据单位都是一个 RDD
  4. Spark 核心引擎将对 DStream 的 Transformation 操作变为针对 Spark 中对 RDD 的 Transformation 操作
    • 将 RDD 经过操作变成中间结果保存在内存中
  5. Spark SQL 中的 DataFrame 和 DataSet 同样基于 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 SQL、MLlib 等无缝衔接

缺点

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