Spark 安装与应用指南
一、Spark 简介
Apache Spark 是一个快速、通用的集群计算系统,提供了高级 API(Java、Scala、Python 和 R)以及支持通用执行图的优化引擎。它支持丰富的高级工具集,包括用于 SQL 和结构化数据处理的 Spark SQL,用于机器学习的 MLlib,用于图形处理的 GraphX 以及用于增量计算和流处理的 Spark Streaming。
二、Spark 安装
1. 安装前准备
-
Java 环境:Spark 需要 Java 8 或更高版本
-
Python 环境(可选):如果使用 PySpark 需要 Python 3.6+
-
Scala 环境(可选):如果使用 Scala API
2. 下载 Spark
从官方下载页面获取最新版本:
复制
下载
https://spark.apache.org/downloads.html
选择适合的版本和包类型(Pre-built for Hadoop 版本或源代码)
3. 安装步骤
Linux/MacOS 安装
bash
复制
下载
# 下载(示例版本3.3.0,Hadoop3.3) wget https://archive.apache.org/dist/spark/spark-3.3.0/spark-3.3.0-bin-hadoop3.tgz # 解压 tar -xzf spark-3.3.0-bin-hadoop3.tgz # 移动到合适目录 mv spark-3.3.0-bin-hadoop3 /opt/spark # 设置环境变量 echo 'export SPARK_HOME=/opt/spark' >> ~/.bashrc echo 'export PATH=$PATH:$SPARK_HOME/bin' >> ~/.bashrc source ~/.bashrc
Windows 安装
-
下载并解压 Spark 到指定目录(如 C:\spark)
-
设置环境变量:
-
SPARK_HOME = C:\spark
-
将 %SPARK_HOME%\bin 添加到 PATH
-
4. 验证安装
bash
复制
下载
spark-shell # 启动Scala交互式shell pyspark # 启动Python交互式shell
三、Spark 核心概念
1. RDD (弹性分布式数据集)
-
不可变的分布式对象集合
-
可分区、可并行操作
-
支持容错
2. DataFrame 和 Dataset
-
结构化数据抽象
-
提供更丰富的优化和执行计划
3. Spark 运行架构
-
Driver 程序:运行应用的 main() 函数
-
Executor:在工作节点上运行任务
-
Cluster Manager:分配资源(Standalone、YARN、Mesos)
四、Spark 应用开发
1. 使用 PySpark 示例
python
复制
下载
from pyspark.sql import SparkSession # 创建SparkSession spark = SparkSession.builder \ .appName("Python Spark Example") \ .getOrCreate() # 创建DataFrame data = [("Alice", 34), ("Bob", 45), ("Charlie", 28)] df = spark.createDataFrame(data, ["Name", "Age"]) # 显示数据 df.show() # 执行SQL查询 df.createOrReplaceTempView("people") result = spark.sql("SELECT * FROM people WHERE age >= 30") result.show() # 停止SparkSession spark.stop()
2. 使用 Scala 示例
scala
复制
下载
import org.apache.spark.sql.SparkSession object SimpleApp { def main(args: Array[String]) { val spark = SparkSession.builder .appName("Simple Application") .getOrCreate() val logData = spark.read.textFile("README.md").cache() val numAs = logData.filter(line => line.contains("a")).count() val numBs = logData.filter(line => line.contains("b")).count() println(s"Lines with a: $numAs, Lines with b: $numBs") spark.stop() } }
五、Spark 集群部署
1. Standalone 模式
bash
复制
下载
# 启动master $SPARK_HOME/sbin/start-master.sh # 启动worker $SPARK_HOME/sbin/start-worker.sh spark://<master-ip>:7077 # 提交应用 spark-submit --master spark://<master-ip>:7077 your_application.py
2. YARN 模式
bash
复制
下载
# 提交应用到YARN集群 spark-submit --master yarn --deploy-mode cluster your_application.py
3. 配置参数
常见配置参数:
-
--executor-memory
: 每个executor的内存 -
--num-executors
: executor数量 -
--executor-cores
: 每个executor的CPU核心数
六、Spark 高级应用
1. Spark SQL
python
复制
下载
# 读取JSON文件创建DataFrame df = spark.read.json("people.json") # 注册为临时表 df.createOrReplaceTempView("people") # SQL查询 teenagers = spark.sql("SELECT name FROM people WHERE age >= 13 AND age <= 19") teenagers.show()
2. Spark Streaming
python
复制
下载
from pyspark.streaming import StreamingContext # 创建StreamingContext,批次间隔1秒 ssc = StreamingContext(spark.sparkContext, 1) # 创建DStream监听本地9999端口 lines = ssc.socketTextStream("localhost", 9999) # 分割每行单词 words = lines.flatMap(lambda line: line.split(" ")) # 计算单词计数 pairs = words.map(lambda word: (word, 1)) wordCounts = pairs.reduceByKey(lambda x, y: x + y) # 打印结果 wordCounts.pprint() # 启动流计算 ssc.start() ssc.awaitTermination()
3. MLlib 机器学习
python
复制
下载
from pyspark.ml.classification import LogisticRegression # 加载训练数据 training = spark.read.format("libsvm").load("data/mllib/sample_libsvm_data.txt") # 创建逻辑回归模型 lr = LogisticRegression(maxIter=10, regParam=0.3, elasticNetParam=0.8) # 拟合模型 lrModel = lr.fit(training) # 打印模型参数 print("Coefficients: " + str(lrModel.coefficients)) print("Intercept: " + str(lrModel.intercept))
七、性能优化技巧
-
数据序列化:使用Kryo序列化
scala
复制
下载
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
-
内存管理:调整内存分配比例
复制
下载
spark.memory.fraction spark.memory.storageFraction
-
数据本地性:尽量让计算靠近数据
-
分区优化:
-
合理设置分区数:
repartition()
-
避免数据倾斜
-
-
缓存策略:合理使用
persist()
和cache()
八、常见问题解决
-
内存不足:
-
增加executor内存
-
减少每个任务的数据量
-
调整内存分配比例
-
-
任务失败:
-
检查日志中的错误信息
-
增加任务重试次数
-
-
性能瓶颈:
-
使用Spark UI分析任务执行情况
-
检查是否有数据倾斜
-
-
连接问题:
-
检查网络连接
-
验证集群管理器配置
-
九、学习资源
-
Spark源代码:GitHub - apache/spark: Apache Spark - A unified analytics engine for large-scale data processing
-
在线课程:Coursera, edX上的大数据课程
-
书籍:《Learning Spark》、《Spark权威指南》