Spark单机快速入门:从部署到数据分析实战

一、Spark Standalone模式部署
1.1 架构解析
graph TD
Master[Spark Master] --> Worker1[Worker]
Master --> Worker2[Worker]
Worker1 --> Executor1[Executor]
Worker1 --> Executor2[Executor]
Worker2 --> Executor3[Executor]
style Master fill:#FF5722
1.2 部署步骤
1.2.1 下载与解压
bash
wget https://archive.apache.org/dist/spark/spark-3.4.2/spark-3.4.2-bin-hadoop3.tgz
tar -xzf spark-3.4.2-bin-hadoop3.tgz -C /opt
sudo ln -s /opt/spark-3.4.2-bin-hadoop3 /opt/spark
1.2.2 环境变量配置
python
# Python脚本自动配置环境变量
with open("/etc/profile.d/spark.sh", "w") as f:
f.write("""\
export SPARK_HOME=/opt/spark
export PATH=$SPARK_HOME/bin:$PATH
export PYSPARK_PYTHON=/usr/bin/python3
""")
subprocess.run("source /etc/profile", shell=True)
1.2.3 核心配置修改
conf/spark-env.sh:
bash
echo "export SPARK_MASTER_HOST=localhost" > $SPARK_HOME/conf/spark-env.sh
echo "export SPARK_WORKER_CORES=4" >> $SPARK_HOME/conf/spark-env.sh
echo "export SPARK_WORKER_MEMORY=4g" >> $SPARK_HOME/conf/spark-env.sh
1.2.4 服务启停
bash
# 启动Master和Worker
$SPARK_HOME/sbin/start-all.sh
# 验证服务状态
curl http://localhost:8080
1.3 Web UI验证
- Master UI : http://localhost:8080
- Worker UI : http://localhost:8081

二、PySpark环境配置与WordCount实战
2.1 环境配置矩阵
math
PySpark环境 =
\begin{cases}
\text{Python 3.8+} \\
\text{Java 8/11} \\
\text{SPARK_HOME正确配置}
\end{cases}
2.2 依赖安装
bash
pip install pyspark findspark
2.3 WordCount完整示例
python
from pyspark.sql import SparkSession
# 初始化Spark会话
spark = SparkSession.builder \
.master("local[*]") \
.appName("WordCount") \
.getOrCreate()
# 创建测试数据集
text_data = [
"Apache Spark is a unified analytics engine",
"Spark SQL is a module for structured data processing",
"Structured Streaming provides scalable fault-tolerant processing"
]
df = spark.createDataFrame(text_data, "string").toDF("text")
# 执行WordCount
word_counts = df.selectExpr("explode(split(text, ' ')) as word") \
.groupBy("word") \
.count() \
.orderBy("count", ascending=False)
# 显示结果
word_counts.show(truncate=False)
# 结果输出到CSV
word_counts.write.csv("wordcount_output")
2.4 执行过程解析
flowchart LR
A[原始文本] --> B[拆分单词]
B --> C[映射为键值对]
C --> D[按单词分组]
D --> E[聚合计数]
E --> F[排序输出]
2.5 性能优化技巧
-
分区策略优化 :
pythondf.repartition(4) # 根据CPU核心数设置分区
-
缓存机制应用 :
pythondf.cache() # 对重复使用的DataFrame进行缓存
-
并行度调整 :
pythonspark.conf.set("spark.default.parallelism", 8)
三、Spark SQL本地数据查询实战
3.1 数据准备
python
# 创建示例数据集
employees = [
("Alice", 28, "Engineering"),
("Bob", 32, "Marketing"),
("Charlie", 45, "Finance")
]
df = spark.createDataFrame(employees, ["name", "age", "department"])
df.createOrReplaceTempView("employees")
3.2 SQL查询示例
3.2.1 基础查询
python
# 执行SQL查询
result = spark.sql("""
SELECT department, AVG(age) as avg_age
FROM employees
GROUP BY department
""")
result.show()
3.2.2 复杂查询
python
# 窗口函数应用
from pyspark.sql.window import Window
from pyspark.sql.functions import rank
windowSpec = Window.partitionBy("department").orderBy("age")
df.withColumn("rank", rank().over(windowSpec)).show()
3.3 数据源操作
3.3.1 CSV文件读写
python
# 读取CSV文件
csv_df = spark.read.csv("data.csv", header=True, inferSchema=True)
# 写入Parquet格式
csv_df.write.parquet("data.parquet")
3.3.2 JSON数据处理
python
json_df = spark.read.json("data.json")
json_df.filter("age > 30").write.mode("overwrite").json("output")
3.4 执行计划分析
python
# 查看逻辑计划
df.explain(mode="extended")
# 物理计划可视化
print(spark.sql("EXPLAIN CODEGEN SELECT * FROM employees").collect()[0][0])
四、性能调优指南
4.1 内存管理模型
math
Executor内存 =
\begin{cases}
\text{Storage Memory} = 0.6 \times \text{总内存} \\
\text{Execution Memory} = 0.2 \times \text{总内存} \\
\text{Reserved Memory} = 0.2 \times \text{总内存}
\end{cases}
4.2 配置参数优化表
参数 | 推荐值 | 说明 |
---|---|---|
spark.executor.memory | 4g | 单个Executor内存分配 |
spark.driver.memory | 2g | Driver进程内存 |
spark.sql.shuffle.partitions | 200 | Shuffle分区数 |
spark.default.parallelism | 200 | 默认并行度 |
4.3 监控指标分析
graph TD
A[Spark UI] --> B[Stage监控]
A --> C[存储内存]
A --> D[任务执行时间]
B --> E{是否存在数据倾斜?}
C --> F{内存是否不足?}
五、常见问题排查
5.1 错误诊断表
错误信息 | 原因分析 | 解决方案 |
---|---|---|
ClassNotFoundException | 依赖JAR包缺失 | 使用--jars参数添加依赖 |
OutOfMemoryError | 内存分配不足 | 调整executor内存参数 |
DataFrame操作缓慢 | 数据倾斜 | 使用repartition或salt技术 |
5.2 日志分析指南
bash
# 查看Driver日志
tail -f $SPARK_HOME/logs/spark--driver.log
# 分析Executor日志
grep "ERROR" $SPARK_HOME/work/*/stderr
六、扩展学习建议
6.1 性能基准测试
python
# 执行时间测量装饰器
import time
def timeit(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
print(f"执行时间: {time.time()-start:.2f}s")
return result
return wrapper
@timeit
def run_query():
spark.sql("SELECT COUNT(*) FROM big_table").show()
6.2 推荐学习路径
graph LR
A[Spark SQL] --> B[结构化流处理]
A --> C[MLlib机器学习]
B --> D[实时数据分析]
C --> E[特征工程]
实战总结 :通过本章学习,您已掌握Spark单机环境的部署与核心操作。接下来可继续探索Spark集群部署与性能优化。完整代码示例可在GitHub仓库获取。
附录:Spark常用命令速查
功能 | 命令 |
---|---|
提交应用 | spark-submit --class ... |
启动PyShell | pyspark |
查看配置 | spark-shell --conf show |
动态调整日志级别 | sc.setLogLevel("WARN") |