初始化SparkSession抛出Py4JJavaError的解决方法
问题根因
抛出该Py4JJavaError的核心原因是PySpark与当前环境的JDK版本不兼容:你当前环境激活的是JDK 17及以上版本,3.3及更早版本的Spark未适配高版本JDK的模块访问限制——高版本JDK默认将sun.nio.ch等内部API封装在模块内不对外暴露,Spark依赖的StorageUtils类无法访问对应类就会触发IllegalAccessError。
你之前通过conda安装JDK时没有指定版本,默认拉取了最新的高版本JDK,因此修复操作没有生效。
解决方案
方案1(优先推荐,稳定性最高):切换到官方适配的JDK长期支持版本
Spark 2.x、3.x系列官方推荐兼容的JDK版本为JDK 8、JDK 11,直接在当前conda环境中安装指定版本即可:
- 先清理之前安装的不匹配JDK包:
conda remove --force java-jdk openjdk
- 安装指定版本的OpenJDK 11(对PySpark 3.x全系列兼容性最好):
conda install -c conda-forge openjdk=11
- 安装完成后在Notebook单元格运行
!java -version验证版本,确认输出为11.x版本后,重启Notebook内核,再运行SparkSession初始化代码即可。如果版本显示仍为高版本,直接退出重启整个Jupyter服务后再验证。
方案2(兼容方案):保留高版本JDK,添加JVM启动参数绕过模块限制
如果你因为其他依赖要求必须使用JDK 17及以上版本,可以在初始化Spark前添加JVM启动参数,开放Spark需要访问的内部模块权限:
在原有初始化代码前添加以下配置:
import os # 配置JVM启动参数,开放对应内部API的访问权限 os.environ['PYSPARK_SUBMIT_ARGS'] = '--add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED pyspark-shell' from pyspark.sql import SparkSession spark = SparkSession.builder.appName('MoviePractice').getOrCreate()
注意:该方案属于权限绕过适配,如果你使用的Spark版本过低,后续可能还会触发其他内部API的访问报错,优先选择方案1切换JDK版本。
内容的提问来源于stack exchange,提问作者Young Sinatra
相关产品推荐
相关产品推荐

