Spark - Streaming
流处理
- Spark SQL 中的 DataFrame API 和 DataSet API 都是基于批处理模式对静态数据进行处理
- 在 2013,Spark 的流处理组件 Spark Streaming 发布,现在的 Spark Streaming 已经非常成熟,应用非常广泛
原理
- Spark Streaming 的原理与微积分的思想很类似
- 微分是无限细分,而积分是对无限细分的每一段进行求和
- 本质 - 将一个连续的问题转换成了无限个离散的问题
- 流处理的数据是一系列连续不断变化,且无边界的,永远无法预测下一秒的数据
- Spark Streaming 用时间片拆分了无限的数据流
- 然后对每个数据片用类似于批处理的方法进行处理,输出的数据也是分块的
- Spark Streaming 提供一个对于流数据的抽象 DStream
- DStream 可以由 Kafka、Flume 或者 HDFS 的流数据生成,也可以由别的 DStream 经过各种转换操作得到
- 底层 DStream 由多个序列化的 RDD 构成,按时间片(如一秒)切分成的每个数据单位都是一个 RDD
- Spark 核心引擎将对 DStream 的 Transformation 操作变为针对 Spark 中对 RDD 的 Transformation 操作
- 将 RDD 经过操作变成中间结果保存在内存中
- Spark SQL 中的 DataFrame 和 DataSet 同样基于 RDD - Spark 最基础的数据抽象 - Java Primitive Type
- 无论是 DataFrame、DataSet、DStream,都具有 RDD 的不可变性、分区性和容错性等特性
- Spark 是一个高度统一的平台
- 所有的高级 API 都具有相同的性质,相互之间很容易转化
- 野心 - 用一套工具统一所有数据处理的场景
- Spark Streaming 将底层细节封装起来,对开发者来说,只需要操作 DStream 即可
DStream
一个连续的 RDD 序列,每个 RDD 代表一个时间窗口的输入数据流
对 DStream 的转换操作,将对它所包含的每一个 RDD 进行同样的转换操作
1 | sc = SparkContext(master, appName) |
- 创建一个 lines DStream,监听来自本机 9999 端口的数据流,每一个数据代表一行文本
- 对 lines 进行 flatMap 操作,把每一个文本行拆分成词语
- 本质上,对一个 DStream 进行 flatMap 操作
- 就是对它里面的每一个 RDD 进行 flatMap 操作,生成一系列新的 RDD,构成一个新的 DStream
RDD 支持的所有的转换操作,DStream 都支持,但 DStream 还支持一些特有操作,如滑动窗口操作
滑动窗口
- 任何 Spark Streaming 程序都需要首先创建一个 StreamingContext 对象,是所有 Streaming 操作的入口
- 可以通过 StreamingContext 创建 DStream
- StreamingContext 中最重要的参数是批处理的时间间隔,即把流数据细分成数据块的粒度
- 该时间间隔决定了流处理的延迟性 - 需要根据需求和资源来衡量间隔的长度
- 滑动窗口 - 每隔一段时间,统计过去某个时间段内的数据
- 每隔 10 秒,输出过去 60 秒内排名前十的热点词
- 滑动窗口的基本参数
- 窗口长度(window length) - 每次统计的数据的时间跨度
- 滑动间隔(sliding interval)- 每次统计的时间间隔
- 由于 Spark Streaming 流处理的最小时间单位为 StreamingContext 的时间间隔
- 因此滑动窗口的两个参数都是 StreamingContext 时间间隔的整数倍
最基本的滑动窗口操作是 window,返回一个新的 DStream,其中的 RDD 代表一段时间窗口内的数据
1 | windowed_words = words.window(60, 10) |
- windowed_words 代表的是热词统计所需要的 DStream
- 里面每一个数据块都包含过去 60 秒内的词语,这样的数据块每 10 秒生成一个
优缺点
优点
- 底层基于 RDD 实现,能复用 RDD 的优良特性(如数据容错性、运行速度等)
- Spark Streaming 是 Spark 生态的一部分,可以与 Spark 核心引擎、Spark SQL、MLlib 等无缝衔接
缺点
- Spark Streaming 的主要缺点是实时计算延迟较高,一般在秒级
- 因为 Spark Streaming 不支持太小的批处理的时间间隔
- Spark Streaming 是一个准实时系统 - Apache Storm 可以做到毫秒级
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.