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
。 - 记忆口诀帮助快速掌握关键环节。
如需某一环节详细源码逐行剖析,可继续提问!