1. Spark概述:Spark发展史、Spark与Hadoop对比、Spark核心组件、Spark生态系统
1.1 Spark发展史:从实验室到工业标配
Spark的故事,得从2009年说起。
那时候我在做MapReduce调优,说实话,被磁盘I/O折磨得够呛。每次迭代计算都要写磁盘,一个简单的逻辑回归跑几十个小时,太痛苦了。
就在那年,加州大学伯克利分校的AMPLab启动了一个项目——Spark。它的核心思想很简单:数据尽量留在内存里算。2010年开源,2013年捐给Apache,2014年成为顶级项目。我记得2015年我参与的第一个生产级Spark项目,集群才20个节点,现在已经上千节点了。
关键里程碑:
- 2009年:伯克利AMPLab启动Spark项目
- 2010年:正式开源
- 2013年:进入Apache孵化器
- 2014年:成为Apache顶级项目,Spark 1.0发布
- 2016年:Spark 2.0发布,引入Dataset API
- 2021年:Spark 3.2发布,支持Python UDF性能大幅提升
为什么Spark能火?说白了,它解决了Hadoop MapReduce最痛的点——中间结果写磁盘。你想想看,机器学习算法要迭代几十次,每次都要读写HDFS,这谁受得了?
1.2 Spark与Hadoop对比:不是替代,是进化
很多人问我:「Spark是不是要取代Hadoop?」
我的回答一直是:Spark不是取代Hadoop,而是让Hadoop生态更完整。Hadoop提供分布式存储(HDFS)和资源管理(YARN),Spark负责高效计算。它们配合得很好。
| 对比维度 | Hadoop MapReduce | Spark |
|---|---|---|
| 计算模式 | 磁盘迭代 | 内存迭代 |
| 处理速度 | 慢(磁盘I/O瓶颈) | 快(内存计算,快10-100倍) |
| 编程模型 | Map + Reduce 两阶段 | DAG + RDD 多阶段 |
| 易用性 | Java为主,代码冗长 | Scala/Python/Java/SQL 都支持 |
| 实时处理 | 不支持 | 支持(Structured Streaming) |
| 机器学习 | 需要额外集成 | 内置MLlib |
我的经验:如果数据量在TB级别以下,且需要迭代计算,Spark是首选。但如果数据量在PB级且计算逻辑简单,MapReduce的稳定性反而更好。我曾经在某个项目中硬用Spark处理PB级ETL,结果内存溢出频繁,最后换回MapReduce反而稳定了。
1.3 Spark核心组件:各司其职的模块化设计
Spark不是一个大而全的怪物,它由几个核心组件组成。我习惯把它们比作一个乐队:
- Spark Core(鼓手):基础框架,负责内存管理、任务调度、容错机制。没有它,其他组件都玩不转。
- Spark SQL(主唱):处理结构化数据,支持SQL查询。我项目中80%的Spark作业都用它。
- Spark Streaming(吉他手):实时流处理。注意,它是微批次架构,不是真正的逐条处理。
- MLlib(键盘手):机器学习库。说实话,生产环境我更喜欢用XGBoost,但MLlib做特征工程很方便。
- GraphX(贝斯手):图计算。用得少,但社交网络分析场景很香。
避坑指南:我曾经在项目中同时用Spark Streaming和Spark SQL处理同一份数据,结果因为内存资源分配不合理,导致频繁GC。后来我学会了——一个SparkContext只干一件事,不同场景拆成不同作业。
1.4 Spark生态系统:不止于计算引擎
Spark的生态,说白了就是「计算引擎 + 周边工具」。我画个图你感受下:
+------------------+------------------+------------------+
| Spark SQL | Spark Streaming | MLlib/GraphX |
| (结构化数据) | (实时流处理) | (机器学习/图) |
+------------------+------------------+------------------+
| Spark Core |
| (内存计算、DAG调度、RDD) |
+----------------------------------------------+
| HDFS / S3 / HBase / Kafka / Cassandra |
| (数据源与存储层) |
+----------------------------------------------+
| YARN / Mesos / Kubernetes / Standalone |
| (资源管理与调度) |
+----------------------------------------------+
嗯,这里要注意:Spark不负责存储。它只是计算引擎,数据存在HDFS、S3或者Kafka里。资源调度可以用YARN、Kubernetes或者Spark自带的Standalone模式。
我个人习惯在生产环境用Spark on YARN,因为和Hadoop集群共用资源,管理方便。但如果你是新项目,我建议试试Spark on Kubernetes,弹性伸缩能力更强。
一句话总结:Spark是一个统一的内存计算引擎,它把批处理、流处理、SQL、机器学习、图计算整合到一个平台里。你不需要为每个场景搭建不同的集群,一个Spark搞定。
我记得刚接触Spark时,觉得它就是个「快一点的MapReduce」。后来深入才发现,它的DAG调度器和RDD血统机制才是真正的精髓。下一章我会详细讲RDD,你准备好,那是Spark最核心的抽象。