一、Spark 简介
Apache Spark 是一个开源的分布式计算框架,专为大规模数据处理设计,具有以下特点:
- 高性能:比 Hadoop MapReduce 快 100 倍(内存计算优化)。
- 多语言支持:支持 Java、Scala、Python、R 等语言。
- 多种计算模式:支持批处理、流处理、机器学习、图计算等。
- 容错性:通过 RDD(弹性分布式数据集)实现数据容错。
二、环境准备
1. 安装前置依赖
- Java:Spark 需要 Java 8 或以上版本。
java -version
- Scala(可选):如果使用 Scala 开发,需安装 Scala。
- Hadoop(可选):如果使用 HDFS 存储数据,需安装 Hadoop。
2. 下载 Spark
从官网下载 Spark:
wget https://downloads.apache.org/spark/spark-3.4.0/spark-3.4.0-bin-hadoop3.tgz
tar -xzf spark-3.4.0-bin-hadoop3.tgz
mv spark-3.4.0-bin /opt/spark
3. 配置环境变量
在 ~/.bashrc
中添加:
export SPARK_HOME=/opt/spark
export PATH=$PATH:$SPARK_HOME/bin
4. 验证安装
启动 Spark Shell:
spark-shell
成功进入 Scala 交互环境后,输入 sc.version
查看 Spark 版本。
三、Spark 核心概念
1. RDD(弹性分布式数据集)
- 定义:RDD 是 Spark 的基本数据结构,表示不可变的分布式数据集。
- 特性:
- 支持并行操作(如
map
、filter
)。 - 通过血统(Lineage)实现容错。
- 支持并行操作(如
- 示例:读取文件并计算行数
val textFile = sc.textFile("hdfs://path/to/file") val count = textFile.count() println(s"Total lines: $count")
2. DataFrame
- 定义:DataFrame 是结构化的 RDD,类似数据库表,支持 SQL 查询。
- 创建方式:
import spark.implicits._ val df = Seq((1, "Alice"), (2, "Bob")).toDF("id", "name") df.show()
3. Spark SQL
- 功能:支持 SQL 查询,兼容 Hive。
- 示例:
val df = spark.read.json("data.json") df.createOrReplaceTempView("table") spark.sql("SELECT * FROM table WHERE age > 20").show()
4. Spark Streaming
- 功能:处理实时数据流。
- 示例:从 socket 接收数据并打印
import org.apache.spark.streaming._ val ssc = new StreamingContext(sc, Seconds(1)) val lines = ssc.socketTextStream("localhost", 9999) lines.print() ssc.start() ssc.awaitTermination()
5. MLlib(机器学习库)
- 功能:提供常用的机器学习算法(如逻辑回归、决策树)。
- 示例:训练逻辑回归模型
from pyspark.ml.classification import LogisticRegression df = spark.read.csv("data.csv", header=True, inferSchema=True) lr = LogisticRegression(featuresCol="features", labelCol="label") model = lr.fit(df)
四、Spark 部署模式
1. 本地模式
适用于开发和测试:
spark-submit --master local[*] your_application.py
2. Standalone 模式
Spark 自带的集群管理模式:
./sbin/start-master.sh
./sbin/start-slave.sh spark://master:7077
3. Yarn 模式
在 Hadoop 集群上运行 Spark:
spark-submit --master yarn your_application.py
4. Kubernetes 模式
在 Kubernetes 集群上部署 Spark。
五、Spark 应用开发
1. 提交应用
使用 spark-submit
提交应用:
spark-submit \
--class com.example.YourApp \
--master yarn \
--deploy-mode cluster \
your-app.jar
2. 监控应用
通过 Spark UI 查看应用状态:
http://<driver-node>:4040
六、实战案例
1. WordCount
from pyspark import SparkContext
sc = SparkContext("local", "WordCount")
lines = sc.textFile("hdfs://path/to/file")
counts = lines.flatMap(lambda x: x.split()) \
.map(lambda x: (x, 1)) \
.reduceByKey(lambda a, b: a + b)
counts.saveAsTextFile("hdfs://path/to/output")
sc.stop()
2. 实时日志分析
使用 Spark Streaming 处理日志数据:
val ssc = new StreamingContext(sc, Seconds(5))
val lines = ssc.socketTextStream("localhost", 9999)
val errorLines = lines.filter(_.contains("ERROR"))
errorLines.saveAsTextFiles("hdfs://path/to/errors")
ssc.start()
ssc.awaitTermination()
七、常见问题与优化
1. 内存管理
- 调整
spark.executor.memory
参数。 - 使用
persist
缓存频繁使用的 RDD。
2. 性能优化
- 避免宽依赖(如
groupByKey
),改用reduceByKey
。 - 使用广播变量(Broadcast Variable)减少数据传输。
3. 调试技巧
- 使用
sc.setLogLevel("DEBUG")
查看详细日志。 - 通过 Spark UI 分析任务执行情况。
八、学习资源
- 官方文档:https://spark.apache.org/docs/latest/
- 教程网站:
- 书籍推荐:
- 《Spark 快速大数据分析》
- 《Learning Spark》