在Windows操作系统上搭建Spark开发环境,需要先解决几个基础依赖问题。与Linux/macOS不同,Windows并非Spark官方推荐的生产环境,但通过合理的配置完全可以满足本地开发和测试需求。我曾在三台不同配置的Win10/Win11设备上部署过Spark 3.x环境,总结出以下可靠方案。
Spark 3.x系列要求Java 8或Java 11运行环境。推荐采用Azul Zulu JDK 11(https://www.azul.com/downloads/),这是经过商业验证的OpenJDK发行版,相比Oracle JDK有更好的Windows兼容性。安装时需注意:
C:\Java\zulu11)bash复制java -version
# 应显示类似:openjdk version "11.0.18" 2023-01-17 LTS
注意:如果系统已安装多个JDK版本,需在环境变量中确保JAVA_HOME指向正确的JDK11路径。我曾遇到因JRE优先导致Spark提交失败的情况,可通过
where java命令检查路径优先级。
Spark运行时需要Hadoop的某些库文件,但完整安装Hadoop并非必须。官方提供了预编译的Hadoop二进制包,这里推荐使用winutils(https://github.com/cdarlint/winutils),这是社区维护的Hadoop Windows兼容组件:
C:\hadoop\bin)bash复制HADOOP_HOME=C:\hadoop
PATH=%PATH%;%HADOOP_HOME%\bin
如果计划使用PySpark,需要Python 3.8+环境。建议使用Miniconda创建独立环境:
bash复制conda create -n pyspark python=3.9
conda activate pyspark
pip install pyspark findspark
从Apache官网(https://spark.apache.org/downloads.html)下载预编译包时需注意:
C:\spark-3.4.1-bin-hadoop3环境变量配置要点:
bash复制SPARK_HOME=C:\spark-3.4.1-bin-hadoop3
PATH=%PATH%;%SPARK_HOME%\bin
spark-defaults.conf模板(位于%SPARK_HOME%\conf):properties复制spark.master local[*]
spark.driver.memory 2g
spark.executor.memory 2g
spark.sql.shuffle.partitions 200
log4j2.properties修改建议:properties复制# 将rootLogger级别从INFO改为WARN
rootLogger.level = warn
运行Spark本地模式测试:
bash复制spark-shell
# 出现Scala交互界面后执行
sc.parallelize(1 to 100).count()
PySpark测试:
python复制from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
df = spark.createDataFrame([(1, "Alice"), (2, "Bob")], ["id", "name"])
df.show()
build.sbt关键依赖:scala复制libraryDependencies += "org.apache.spark" %% "spark-core" % "3.4.1"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "3.4.1"
bash复制-Dspark.master=local[*]
通过以下命令启动PySpark内核:
bash复制pyspark --master local[*]
或者在已有Python环境中:
python复制import findspark
findspark.init("C:/spark-3.4.1-bin-hadoop3")
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
spark.driver.memory参数对于8GB内存的Windows开发机,推荐配置:
properties复制spark.driver.memory=2g
spark.executor.memory=2g
spark.memory.fraction=0.6
spark.memory.storageFraction=0.5
spark.local.dir指向高速SSD路径properties复制spark.memory.offHeap.enabled=true
spark.memory.offHeap.size=1g
%SPARK_HOME%\logsbash复制jstack <driver-pid> > thread_dump.log
| 错误现象 | 原因分析 | 解决方案 |
|---|---|---|
java.io.IOException: Could not locate executable null\bin\winutils.exe |
Hadoop环境变量未正确配置 | 检查HADOOP_HOME路径和winutils.exe权限 |
Failed to initialize compiler: object java.lang.Object in compiler mirror |
Scala版本冲突 | 确保IDEA/SBT使用的Scala版本与Spark内置版本一致 |
OutOfMemoryError: GC overhead limit exceeded |
驱动内存不足 | 增加spark.driver.memory并添加-XX:+UseG1GC参数 |
bash复制bcdedit.exe /set nx AlwaysOff
bash复制Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
--packages加载未经验证的第三方包--conf参数传入spark.local.dir指定路径下的内容我在实际使用中发现,Windows Defender实时保护可能影响Spark性能,建议将Spark工作目录添加到排除列表。另外,对于需要连接Hadoop集群的情况,推荐使用SSH隧道而非直接暴露集群端口。