当前位置: 首页 > java >正文

Spark Streaming 内部运行机制详解

核心思想:将实时数据流切割为“微批次”,利用 Spark Core 的批处理能力进行准实时计算。


1. 核心流程拆解

  1. 数据接收(Input Data Stream)

    • 输入源:Kafka、Flume、Socket 等实时数据流。

    • 接收器(Receiver):Spark Streaming 启动接收器线程,持续监听数据流并缓存到内存(或磁盘)。

  2. 批次划分(Micro-Batching)

    • 时间窗口:按固定时间间隔(如 1秒、5秒)将数据流切割为多个小批次(DStream)。

    • 示例:若间隔为 2秒,则每 2秒的数据组成一个批次,形成 Batch 1Batch 2...

  3. Spark Core 处理

    • RDD 转换:每个批次的数据转换为一个 RDD,调用 Spark Core 的算子(如 mapreduce)处理。

    • 并行计算:Driver 将任务分发给 Executor,各节点并行处理对应分区的数据。

  4. 结果输出

    • 输出操作:处理完一个批次后,结果写入外部系统(如 HDFS、数据库)或展示在实时仪表盘。


2. 核心概念:DStream(离散化流)
  • 本质:DStream 是 Spark Streaming 的核心抽象,表示按时间切分的 RDD 序列

  • 特性

    • 每个时间间隔生成一个 RDD(如 DStream = [RDD1, RDD2, ...])。

    • 支持与 RDD 类似的转换操作(如 mapfilterreduceByKey)。

示例代码

// 创建 DStream(从 Socket 接收数据,批次间隔 1秒)
val ssc = new StreamingContext(sparkConf, Seconds(1))
val lines = ssc.socketTextStream("localhost", 9999)// 处理数据:按单词拆分并计数
val words = lines.flatMap(_.split(" "))
val wordCounts = words.map(word => (word, 1)).reduceByKey(_ + _)// 输出结果
wordCounts.print()
ssc.start()         // 启动计算
ssc.awaitTermination()  // 等待终止

3. 为何称为“准实时”?
  • 微批处理(Micro-Batching)

    • 数据按固定时间窗口(如 1秒)分批处理,延迟 = 窗口间隔 + 处理时间(通常秒级)。

    • 对比真正的实时处理(如 Flink 的逐事件处理),延迟稍高但吞吐量更大。

  • 适用场景

    • 日志分析、实时仪表盘、异常检测等允许秒级延迟的场景。

    • 不适用于毫秒级延迟需求(如高频交易)。


4. 容错与可靠性
  • 数据恢复

    • Checkpoint 机制:定期保存 DStream 的血缘(Lineage)和元数据,故障时从检查点恢复。

    • WAL(Write-Ahead Log):接收器将数据写入预写日志,确保数据不丢失。

  • Exactly-Once 语义

    • 结合事务性写入(如数据库事务),保证每个批次的数据处理且仅处理一次。


5. 性能优化要点
优化方向方法
减少批次间隔缩小窗口间隔(如从 2秒 → 1秒),但需平衡吞吐量和延迟。
并行度调整增加接收器和 Executor 的数量,提升数据接收与处理并行度。
内存管理控制接收器缓存大小(spark.streaming.receiver.maxRate),避免 OOM。
背压机制启用 spark.streaming.backpressure.enabled,动态调整接收速率。

总结

Spark Streaming = 微批处理 + Spark Core 批处理引擎

  • 优势:继承 Spark 的易用性、容错性和高吞吐量。

  • 局限:秒级延迟,不适合超低延迟场景(此类需求可转向 Structured Streaming 或 Flink)。

  • 核心公式
    实时数据流 → 按时间切分为 DStream → 转换为 RDD 批次处理 → 输出结果

http://www.xdnf.cn/news/5912.html

相关文章:

  • MySQL 深度分页怎么优化?
  • 基于 Spring Boot 瑞吉外卖系统开发(十三)
  • SpringBoot中的拦截器
  • 精简大语言模型:用于定制语言模型的自适应知识蒸馏
  • RobotxR1:通过闭环强化学习在大语言模型上实现具身机器人智能
  • 【Web应用】Vue 项目前端项目文件夹和文件介绍
  • 17.责任链模式:思考与解读
  • Mysql索引优化
  • State(状态)——对象行为型模式
  • 在scala中sparkSQL读入csv文件
  • 【AI提示词】贝叶斯分析专家
  • C语言编程--二叉树--构建解析树
  • iOS - 如何从appStore获取app版本信息
  • 各类芒果(果实、叶片、产量等)相关数据集
  • Python爬虫实战:研究JavaScript 环境补全逆向解密
  • SQLMesh信号机制详解:如何精准控制模型评估时机
  • CSS可以继承的样式汇总
  • 【言语】刷题3
  • 串口模块详细讲解
  • IO、存储、硬盘、文件系统相关常识
  • 【Bluedroid】蓝牙 HID DEVICE 初始化流程源码解析
  • 十天学会嵌入式技术之51单片机—day-9
  • 【技巧】使用UV创建python项目的开发环境
  • 面试篇:Spring Security
  • C语言—再学习(数据的存储类别)
  • C++ 字符格式化输出
  • python学习笔记七(文件)
  • 分布式链路跟踪
  • lubuntu 系统详解
  • WebpackVite总结篇与进阶