作为一名长期在Windows平台进行大数据开发的技术老兵,我深知在Windows上配置Spark环境的种种痛点。本文将手把手带你完成Spark 3.5.8环境的完整部署,包含那些官方文档没写但实际开发中必踩的坑。
虽然Spark 3.5官方宣称支持Java 8/11/17,但在Windows平台上,JDK 8仍然是经过最广泛验证的选择。这主要基于三个现实考量:
实测发现:使用JDK 11时,Spark SQL与Hive Metastore的集成会出现序列化异常;而JDK 17则会导致Spark UI的部分监控指标丢失。
在开始前,请确保准备好以下资源:
| 组件 | 推荐版本 | 下载来源 | 备注 |
|---|---|---|---|
| JDK | 8u381 | Eclipse Temurin | 选Windows x64 MSI安装包 |
| Spark | 3.5.8 | Apache官网 | Pre-built for Hadoop 3 |
| winutils | hadoop-3.3.4 | GitHub仓库 | 需匹配Hadoop版本 |
安装JDK时,这几个细节决定了后续能否顺利运行:
安装路径规范:
Program Files)D:\java\jdk8PATH配置技巧:
bash复制# 正确顺序应该是:
%JAVA_HOME%\bin
%SPARK_HOME%\bin
%HADOOP_HOME%\bin
环境变量顺序错误可能导致调用错误的Java版本
验证安装的完整姿势:
powershell复制# 不仅要检查java命令
java -version
# 还要验证编译器是否可用
javac -version
# 最后确认JAVA_HOME是否生效
echo %JAVA_HOME%
解压Spark安装包时,这些经验可以节省你数小时排错时间:
路径选择原则:
D:\spark\spark-3.5.8)权限配置要点:
powershell复制# 对Spark目录赋予完全控制权限
icacls "D:\spark" /grant Everyone:(OI)(CI)F
否则运行时会报Permission denied错误
环境变量陷阱:
%SPARK_HOME%\bin而非%SPARK_HOME%这是Windows平台特有的配置项,90%的启动失败都源于此:
版本匹配规则:
UnsatisfiedLinkError目录结构规范:
code复制D:\hadoop
├── bin
│ ├── winutils.exe
│ └── hadoop.dll
└── etc
└── hadoop
└── (空目录)
缺少etc/hadoop目录会导致HDFS相关功能异常
环境变量验证:
powershell复制# 检查Hadoop配置
winutils.exe ls /
# 正常应返回根目录列表
不要满足于简单的spark-shell启动,建议执行完整验证:
基础功能测试:
powershell复制spark-shell --version
# 应显示Spark和Scala版本信息
交互式验证:
scala复制// 在spark-shell中执行
val rdd = sc.parallelize(1 to 1000000)
println(rdd.count())
// 观察执行日志和UI监控
SparkPi示例:
powershell复制spark-submit --class org.apache.spark.examples.SparkPi %SPARK_HOME%\examples\jars\spark-examples_*.jar 100
| 错误现象 | 根本原因 | 解决方案 |
|---|---|---|
'winutils' not found |
HADOOP_HOME未正确设置 | 检查路径是否包含bin目录 |
AccessControlException |
权限不足 | 对临时目录设置完全控制权限 |
StackOverflowError |
JDK版本冲突 | 卸载其他版本JDK |
4040端口占用 |
之前实例未关闭 | 执行stop-all.cmd |
内存配置调整:
bash复制# 在spark-env.cmd中添加
set SPARK_DRIVER_MEMORY=2g
set SPARK_EXECUTOR_MEMORY=4g
并行度设置:
scala复制// 在代码中配置
spark.conf.set("spark.default.parallelism",
Runtime.getRuntime.availableProcessors() * 2)
日志级别控制:
bash复制# 创建log4j.properties文件
log4j.rootCategory=WARN, console
| Spark版本 | Python支持 |
|---|---|
| 3.5.x | 3.7-3.10 |
| 3.4.x | 3.6-3.9 |
bash复制# 使用conda创建独立环境
conda create -n pyspark python=3.8
conda install numpy pandas pyarrow
python复制from pyspark.sql import SparkSession
spark = SparkSession.builder \
.appName("TestApp") \
.getOrCreate()
df = spark.createDataFrame([(1, "Alice"), (2, "Bob")], ["id", "name"])
df.show()
IntelliJ IDEA配置:
xml复制<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>3.5.8</version>
</dependency>
VS Code配置:
通过修改配置启动本地集群:
bash复制set SPARK_MASTER_HOST=localhost
set SPARK_WORKER_CORES=4
start-master.cmd
start-worker.cmd spark://localhost:7077
最后提醒:每次修改环境变量后,必须重启所有终端窗口和IDE才能生效。建议将常用配置写入spark-env.cmd脚本实现自动化加载。