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. 流式微批任务调度原理
核心流程:
- StreamingContext.start()启动流式计算。
- JobScheduler和- JobGenerator每隔batch interval切分任务。
- JobGenerator生成每批Job,提交到- JobScheduler。
- JobScheduler调度到Spark Core的DAGScheduler执行。
源码路径与方法:
1.1 StreamingContext.start()
入口方法:
// org.apache.spark.streaming.StreamingContext
def start(): Unit = {// 1. 启动JobSchedulerscheduler.start()
}
口诀:
 启动从start起,调度靠scheduler。
1.2 JobScheduler.start()
// org.apache.spark.streaming.scheduler.JobScheduler
def start(): Unit = {// 1. 启动JobGenerator线程jobGenerator.start()// 2. 启动ReceiverTracker用于数据接收receiverTracker.start()
}
口诀:
 JobGenerator管切批,ReceiverTracker收数据。
1.3 JobGenerator.start()
// org.apache.spark.streaming.scheduler.JobGenerator
def start(): Unit = {// 1. 定时调度generateJobstimer.start()
}
口诀:
 定时任务切分批,timer驱动generateJobs。
1.4 generateJobs(time)
// org.apache.spark.streaming.scheduler.JobGenerator
private def generateJobs(time: Time): Seq[Job] = {// 1. 为每个outputStream生成一个Jobgraph.generateJobs(time)
}
口诀:
 每批生成Job,DStream图遍历。
1.5 JobScheduler.submitJobSet
// org.apache.spark.streaming.scheduler.JobScheduler
def submitJobSet(jobSet: JobSet) {// 1. 交给线程池并发执行jobExecutor.execute(new JobHandler(job))
}
口诀:
 JobSet成组投,线程池分发忙。
1.6 ReceiverTracker.start()
// org.apache.spark.streaming.scheduler.ReceiverTracker
def start(): Unit = {// 1. 启动ReceiverSupervisor在Executor上采集数据endpoint.send(StartAllReceivers)
}
口诀:
 Receiver分布式采,Supervisor收原始。
2. 源码行级剖析与注释
以JobGenerator.generateJobs为例:
// 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语义强。
- 源码关键流程:StreamingContext→JobScheduler→JobGenerator→generateJobs→submitJobSet。
- 记忆口诀帮助快速掌握关键环节。
如需某一环节详细源码逐行剖析,可继续提问!
