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
  • 记忆口诀帮助快速掌握关键环节。

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

相关推荐
AAA小肥杨4 小时前
基于k8s的Python的分布式深度学习训练平台搭建简单实践
人工智能·分布式·python·ai·kubernetes·gpu
爬山算法7 小时前
Redis(73)如何处理Redis分布式锁的死锁问题?
数据库·redis·分布式
IT小哥哥呀8 小时前
电池制造行业数字化实施
大数据·制造·智能制造·数字化·mom·电池·信息化
Xi xi xi8 小时前
苏州唯理科技近期也正式发布了国内首款神经腕带产品
大数据·人工智能·经验分享·科技
yumgpkpm9 小时前
华为鲲鹏 Aarch64 环境下多 Oracle 、mysql数据库汇聚到Cloudera CDP7.3操作指南
大数据·数据库·mysql·华为·oracle·kafka·cloudera
祈祷苍天赐我java之术9 小时前
Redis 数据类型与使用场景
java·开发语言·前端·redis·分布式·spring·bootstrap
UMI赋能企业9 小时前
制造业流程自动化提升生产力的全面分析
大数据·人工智能
TDengine (老段)10 小时前
TDengine 数学函数 FLOOR 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
猫林老师12 小时前
HarmonyOS线程模型与性能优化实战
数据库·分布式·harmonyos
派可数据BI可视化12 小时前
商业智能BI 浅谈数据孤岛和数据分析的发展
大数据·数据库·数据仓库·信息可视化·数据挖掘·数据分析