PySpark无法创建SparkSession(Java网关错误)求助
解决Windows下PySpark 2.3.3创建SparkSession时Java网关进程退出的问题
针对你遇到的Exception: Java gateway process exited before sending its port number错误,我整理了几个Windows环境下的可行排查和解决步骤:
1. 校验环境变量的准确性
Windows环境下PySpark对环境变量的路径非常敏感,务必确认以下几点:
- JAVA_HOME必须指向JDK根目录:比如你的Java安装在
C:/Java,要确保这个目录下的bin子文件夹里有javac.exe(仅JRE会导致Spark启动失败)。建议把JAVA_HOME设为C:/Java/jdk1.8.0_201(如果你的JDK是这个子目录的话)。 - SPARK_HOME指向Spark根目录:确认路径是
C:\spark-2.3.3-bin-hadoop2.7,路径中不要包含空格或特殊字符。 - PATH优先级调整:把
%JAVA_HOME%\bin、%SPARK_HOME%\bin放到系统PATH的最顶端,避免系统中其他版本的Java或工具干扰。 - 验证:打开命令提示符,执行
java -version和javac -version,两者都要显示1.8.0_201,确保javac命令能正常执行(这是JDK的标志)。
2. 查看Spark日志定位具体错误
自动启动失败时,Spark会生成详细日志,你可以通过日志找到根本原因:
- 日志路径:
C:\spark-2.3.3-bin-hadoop2.7\logs - 找到最新的以
spark-<你的用户名>-org.apache.spark.deploy.SparkSubmit-1开头的日志文件,查看里面的报错信息,常见问题比如Hadoop依赖缺失、权限不足等。
3. 补充Windows专属的Hadoop依赖文件
Spark 2.3.x依赖Hadoop组件,预构建版本虽然自带Hadoop,但Windows系统需要额外的winutils.exe和hadoop.dll:
- 创建目录
C:\hadoop\bin - 下载对应Hadoop 2.7版本的
winutils.exe和hadoop.dll放到这个目录(必须和Spark绑定的Hadoop版本一致) - 添加系统环境变量
HADOOP_HOME,值为C:\hadoop - 把
%HADOOP_HOME%\bin添加到系统PATH中
4. 确认Python版本兼容性
PySpark 2.3.3仅支持Python 2.7、3.4、3.5、3.6版本,如果你的Python是3.7及以上版本,大概率会出现兼容性问题。可以通过命令python --version查看当前版本,必要时切换到符合要求的Python版本。
5. 手动启动Java网关并指定端口
自动启动网关失败时,尝试手动启动并指定端口:
- 打开命令提示符,进入Spark的bin目录:
cd C:\spark-2.3.3-bin-hadoop2.7\bin - 执行启动命令:
spark-submit --master local --class org.apache.spark.deploy.SparkSubmit --conf spark.driver.port=4040 --conf spark.blockManager.port=4041 - 在Python代码中指定网关端口:
from pyspark.sql import SparkSession import os os.environ["PYSPARK_GATEWAY_PORT"] = "4040" spark = SparkSession.builder.appName("Hello").master("local").getOrCreate()
6. 排查防火墙/杀毒软件干扰
Windows防火墙或第三方杀毒软件可能会阻止Java网关的端口通信,建议临时关闭防火墙和杀毒软件,再尝试创建SparkSession,确认是否是这个原因导致的问题。
内容的提问来源于stack exchange,提问作者Sanchit Kumar
相关产品推荐
相关产品推荐

