Spark Streaming 简介

一、定义

        Spark Streaming 是 Spark 的流式数据处理模块。Spark Streaming 支持的数据输入源有很多,例如:Kafka、Flume、Twitter、ZeroMQ 和简单的 TCP 套接字等。

二、DStream 和 Structured Streaming

        Spark Streaming 使用离散化流(DStream)作为基本抽象。DStream 是一系列连续的 RDD,每个 RDD 代表一段时间内收集的数据。在 Spark Streaming 中,数据流被分成一系列批次,每个批次处理一段时间内的数据。

        除了 DStream,Spark Streaming 还支持结构化流(Structured Streaming),这是从 Spark 2.0 开始引入的更高层次的 API。结构化流使用 DataFrame 和 Dataset API,并提供了更简单的编程模型和更好的性能。

2.1 离散化流(DStream)

2.1.1 核心概念

  • 本质:一个 DStream 本质上是一系列连续的 RDD。每个 RDD 包含一个特定时间间隔内到达的数据。

  • 时间片:Spark Streaming 将实时数据流按时间切分成小的批次(例如 1 秒或 2 秒)。每个批次的数据对应一个 RDD。

  • 不可变性:和 RDD 一样,DStream 也是不可变的。任何转换操作都会生成一个新的

  • 操作类型:DStream 提供了许多与 RDD 相似的操作,如 map、reduce、join 等,同时还提供了与时间相关的操作,如滑动窗口操作。

2.1.2 创建方式

// 方式1:通过 SparkConf 创建
val conf = new SparkConf().setAppName("StreamingApp").setMaster("local[2]")
val ssc = new StreamingContext(conf, Seconds(5))  // 5秒批处理间隔

// 方式2:通过已有的 SparkContext 创建
val sc = new SparkContext(conf)
val ssc = new StreamingContext(sc, Seconds(5))

2.1.3 特点

  • 优点

    • 基于成熟的 RDD 模型,与 Spark Core 紧密结合。

    • 提供细粒度的控制,特别是通过 foreachRDD

  • 缺点

    • 处理延迟较高:因为是微批次处理,延迟通常在秒级。

    • API 级别较低:开发者需要自己处理与时间相关的逻辑(如事件时间、延迟数据)。

    • 不感知执行计划:无法像 DataFrame 一样进行 Catalyst 优化。

2.2 结构化流(Structured Streaming)

2.2.1 核心概念

  • 结构化流是构建在 Spark SQL 引擎上的流处理引擎,使用 Dataset/DataFrame API。

  • 它将实时数据流视为一张无界表,新的数据不断追加到这张表中。

  • 支持基于事件时间的处理、水位线(watermark)处理延迟数据、以及容错状态管理。

  • 输出模式包括追加模式、更新模式和完整模式。

2.2.2 创建方式

// 使用 SparkSession(与 Spark SQL 相同)
val spark = SparkSession.builder()
  .appName("StructuredStreamingApp")
  .master("local[2]")
  .config("spark.sql.streaming.schemaInference", "true")
  .config("spark.sql.streaming.checkpointLocation", "/checkpoint/path")
  .getOrCreate()

2.2.3 关键特性

  1. 事件时间与水位线

    • 事件时间:数据本身产生的时间戳,而不是到达系统的时间。这对于处理乱序和延迟的数据至关重要。

    • 水位线:一个机制,用于告诉 Spark 可以“等待”延迟数据多久。当处理基于事件时间的窗口时,水位线让引擎可以跟踪当前处理的事件时间,并自动清理旧的状态。

  2. 输出模式

    • Append 模式:只将窗口中最终的结果输出一次。这是默认模式。

    • Update 模式:以增量方式输出,每当一条记录被更新就输出一次。

    • Complete 模式:每次触发后,输出完整的计算结果(适用于有状态操作,如聚合)。

  3. 端到端 exactly-once 语义
    Structured Streaming 通过与源端和输出端的集成,可以保证在发生故障时,每条记录被精确处理一次,不丢不重。

2.3 总结对比

特性DStream (微批次)Structured Streaming
编程模型基于 RDD 的低级 API基于 DataFrame/Dataset 的高级声明式 API
API 级别较低级,需手动处理状态、窗口较高级,内置对事件时间、窗口、水位线的支持
性能优化无自动优化利用 Spark SQL 的 Catalyst 优化器和 Tungsten 执行引擎
延迟秒级(微批次)可达毫秒级(微批次),还有更低延迟的连续处理模式
语义保证At-least-once 或 exactly-once(需精心设计)端到端的 Exactly-once 语义
学习曲线需要理解 RDD 和流处理概念对于熟悉 Spark SQL 的开发者更简单
推荐程度遗留系统,需要极细粒度控制时使用新项目的首选,功能更强大,开发更简单

三、Spark Streaming 架构

3.1 架构图

3.2 背压机制

        在 Spark 1.5 之后,引入了背压机制。系统能够自动根据当前的处理能力动态调整接收数据的速率,防止在流量高峰时内存被撑爆。根据 Job Scheduler 反馈作业的执行信息来动态调整 Receiver 数据接收速率。

        通过属性“spark.streaming.backpressure.enabled”来控制是否启用 backpressure 机制,默认值 false,即不启用。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值