Spark Streaming原理与应用

下面我将从Spark Streaming的原理、应用到源码进行详细剖析,并给出关键源码方法、内部逻辑、行级注释和记忆口诀,帮助你高效掌握Spark Streaming流式计算。


一、Spark Streaming原理与应用

1. 微批计算原理

原理:

  • Spark Streaming把实时数据流切分成小批次(batch),每个batch用Spark作业处理。
  • 处理流程:采集(Receiver)→ 切分(Batch)→ 计算(DStream)→ 输出(Output)。

核心源码:

  • JobScheduler, JobGenerator, ReceiverTracker
  • batch切分关键方法JobGenerator.generateJobs(time)

口诀:

流转批,批为王,DStream变RDD,作业忙。


2. Standalone集群支持

原理:

  • Spark Streaming可运行于YARN、Mesos、K8s、Standalone等集群。
  • Standalone模式下,spark-submit提交应用,Master分配资源。

关键源码:

  • org.apache.spark.deploy.master.Master
  • org.apache.spark.deploy.worker.Worker

口诀:

独立集群易部署,Master调度Worker忙。


3. API详解

常用API:

  • StreamingContext:流式上下文
  • DStream:离散流
  • inputStream = ssc.socketTextStream(...)
  • dstream.map/flatMap/filter/union/window/reduceByKeyAndWindow
  • dstream.foreachRDD

口诀:

流上下文,DStream链,算子操作随心变。


4. 高可用(HA)机制

原理:

  • Driver高可用:结合Zookeeper实现。
  • Standalone模式下,Master支持HA。
  • Streaming应用级HA靠Checkpoint恢复。

关键源码:

  • org.apache.spark.streaming.Checkpoint

口诀:

主备切换靠ZK,检查点存状态。


5. 检查点与窗口机制

检查点(Checkpoint)

原理:

  • 保存应用元数据与中间状态,Driver故障可恢复。

代码关键点:

  • ssc.checkpoint("hdfs://...")

窗口(Window)

原理:

  • window算子:滑动窗口聚合流数据。

关键API:

  • dstream.window(windowDuration, slideDuration)

口诀:

检查点保命根,窗口滑动批内存。


6. 与MQ/Kafka整合开发

原理:

  • Spark Streaming通过KafkaUtils.createDirectStream与Kafka对接。
  • 支持Exactly-Once语义。

关键源码:

  • KafkaInputDStream, DirectKafkaInputDStream

口诀:

Kafka对接Direct强,偏移管理更稳妥。


二、Spark Streaming源码分析

1. 流式微批任务调度原理

核心流程:

  1. StreamingContext.start()启动流式计算。
  2. JobSchedulerJobGenerator每隔batch interval切分任务。
  3. JobGenerator生成每批Job,提交到JobScheduler
  4. JobScheduler调度到Spark Core的DAGScheduler执行。

源码路径与方法:

1.1 StreamingContext.start()

入口方法:

scala 复制代码
// org.apache.spark.streaming.StreamingContext
def start(): Unit = {
  // 1. 启动JobScheduler
  scheduler.start()
}

口诀:

启动从start起,调度靠scheduler。


1.2 JobScheduler.start()

scala 复制代码
// org.apache.spark.streaming.scheduler.JobScheduler
def start(): Unit = {
  // 1. 启动JobGenerator线程
  jobGenerator.start()
  // 2. 启动ReceiverTracker用于数据接收
  receiverTracker.start()
}

口诀:

JobGenerator管切批,ReceiverTracker收数据。


1.3 JobGenerator.start()

scala 复制代码
// org.apache.spark.streaming.scheduler.JobGenerator
def start(): Unit = {
  // 1. 定时调度generateJobs
  timer.start()
}

口诀:

定时任务切分批,timer驱动generateJobs。


1.4 generateJobs(time)

scala 复制代码
// org.apache.spark.streaming.scheduler.JobGenerator
private def generateJobs(time: Time): Seq[Job] = {
  // 1. 为每个outputStream生成一个Job
  graph.generateJobs(time)
}

口诀:

每批生成Job,DStream图遍历。


1.5 JobScheduler.submitJobSet

scala 复制代码
// org.apache.spark.streaming.scheduler.JobScheduler
def submitJobSet(jobSet: JobSet) {
  // 1. 交给线程池并发执行
  jobExecutor.execute(new JobHandler(job))
}

口诀:

JobSet成组投,线程池分发忙。


1.6 ReceiverTracker.start()

scala 复制代码
// org.apache.spark.streaming.scheduler.ReceiverTracker
def start(): Unit = {
  // 1. 启动ReceiverSupervisor在Executor上采集数据
  endpoint.send(StartAllReceivers)
}

口诀:

Receiver分布式采,Supervisor收原始。


2. 源码行级剖析与注释

JobGenerator.generateJobs为例:

scala 复制代码
// org.apache.spark.streaming.scheduler.JobGenerator
private def generateJobs(time: Time): Seq[Job] = {
  // 1. 遍历DStreamGraph所有OutputStream(输出算子)
  graph.outputStreams.flatMap { outputStream =>
    // 2. 为当前时间点生成Job(RDD依赖链)
    outputStream.generateJob(time)
  }
}

注释口诀:

遍历输出算子流,当前批次生成Job。


3. 速记口诀总汇

环节 口诀
微批原理 流转批,批为王,DStream变RDD,作业忙。
Standalone 独立集群易部署,Master调度Worker忙。
API 流上下文,DStream链,算子操作随心变。
高可用 主备切换靠ZK,检查点存状态。
检查点窗口 检查点保命根,窗口滑动批内存。
Kafka整合 Kafka对接Direct强,偏移管理更稳妥。
调度流程 启动从start起,调度靠scheduler。
切批 JobGenerator管切批,ReceiverTracker收数据。
定时批处理 定时任务切分批,timer驱动generateJobs。
Job生成 每批生成Job,DStream图遍历。
Job分发 JobSet成组投,线程池分发忙。
Receiver Receiver分布式采,Supervisor收原始。
源码注释 遍历输出算子流,当前批次生成Job。

总结

  • Spark Streaming通过微批机制实现准实时流处理。
  • Standalone集群支持易部署,HA机制依赖Zookeeper+Checkpoint。
  • 与Kafka整合常用Direct流,Exactly-Once语义强。
  • 源码关键流程:StreamingContextJobSchedulerJobGeneratorgenerateJobssubmitJobSet
  • 记忆口诀帮助快速掌握关键环节。

如需某一环节详细源码逐行剖析,可继续提问!

相关推荐
DolphinScheduler社区1 分钟前
DolphinScheduler 3.3.2 如何调用 DataX 3.0 + SeaTunnel 2.3.12?附 Demo演示!
java·spark·apache·海豚调度·大数据工作流调度
瑞华丽PLM20 分钟前
传统研发协同低效痛点待解,PLM 系统数字化选型助力研发效率提升与转型
大数据·plm·国产plm·瑞华丽plm·瑞华丽
乐迪信息30 分钟前
乐迪信息:实时预警,秒级响应:船舶AI异常行为检测算法
大数据·人工智能·算法·安全·目标跟踪
红色星际33 分钟前
进军具身机器人和Robotaxi的智驾公司
大数据·人工智能·机器人
Bruce_Liuxiaowei33 分钟前
《轻量化制播系统技术应用指南(2026版)》解读:县级融媒体的“减负增效“新路径
大数据·人工智能·媒体
2601_9561394241 分钟前
文旅行业品牌全案公司哪家强
大数据·人工智能·python
生活观察站42 分钟前
中文在线亮相横琴—澳门国际数字艺术博览会国际数字创意论坛:AI漫剧打开内容创作新想象
大数据·人工智能
地球资源数据云1 小时前
1900-2023年中国物种分布点位矢量数据集
大数据·数据结构·数据库·数据仓库·人工智能
菜鸟小码1 小时前
MapReduce 真正的核心之Shuffle 阶段深度解析:分区、排序、合并与归约
大数据·mapreduce
Vwms1 小时前
2026 医药制造 WMS 选型指南:GMP 合规仓储管理系统怎么选
大数据·wms·wms选型