本文针对 PySpark 3.5.1 在 Windows 下调用 .show() 报 Py4JJavaError 和 EOFException 的典型问题,系统梳理 Java、Python、Spark 三者的版本兼容约束,明确指出 JDK 20 不被支持,并提供可立即生效的环境修正方案。
本文针对 pyspark 3.5.1 在 windows 下调用 `.show()` 报 `py4jjavaerror` 和 `eofexception` 的典型问题,系统梳理 java、python、r、spark 三者的版本兼容约束,明确指出 jdk 20 不被支持,并提供可立即生效的环境修正方案。
Apache Spark 是一个严格遵循 JVM 生态兼容规范的大数据计算引擎,其各组件(包括 PySpark、Spark Core、SQL 引擎及底层序列化机制)均深度依赖 Java 运行时行为。您当前遇到的 java.io.EOFException 错误(常伴随 Py4JJavaError 栈跟踪),表面是 Python 进程与 JVM 间通信中断,但根本原因在于 JDK 版本严重越界——您正在使用 JDK 20,而 Spark 3.5.1 官方明确仅支持 JDK 8、11 和 17(参见 Spark 3.5.1 官方文档 的“Requirements”章节)。JDK 20 引入了模块系统强化、废弃 API 移除及 JVM 内部协议变更(如 sun.nio.ch.DirectBuffer 访问限制加剧),直接导致 Spark 的 JNI 调用链(尤其是 PythonRunner 与 DataInputStream 交互)在序列化/反序列化阶段崩溃,表现为 EOFException。
✅ 正确版本组合(Spark 3.5.1 官方认证)
| 组件 | 兼容版本范围 | 推荐选择 | 说明 |
|---|---|---|---|
| Java | 8u371+, 11.0.20+, 17.0.8+ | JDK 17.0.8+(首选)或 JDK 11.0.20+ | JDK 8 已进入 EOL;JDK 17 是 LTS,Spark 3.5.1 对其适配最成熟;JDK 20 完全不支持 |
| Python | 3.8+(官方文档明确) | Python 3.11(强推荐) | Python 3.12 虽在部分场景可用,但 PySpark 3.5.1 的 py4j 绑定(py4j-0.10.9.7)尚未全面验证其 ABI 兼容性,易引发静默通信异常 |
| Scala | 2.12/2.13(Spark 编译所用) | 无需手动安装 | PySpark 用户可忽略,但需确保 SPARK_HOME 指向预编译包(如 spark-3.5.1-bin-hadoop3) |
? 立即修复步骤(Windows)
-
卸载 JDK 20,安装 JDK 17(推荐)
- 从 Oracle JDK 17 或 Eclipse Temurin JDK 17 下载并安装。
- 更新环境变量 JAVA_HOME:
setx JAVA_HOME "C:\Program Files\Eclipse Adoptium\jdk-17.0.8.1-hotspot" /M
- 验证:
java -version # 输出应为:java version "17.0.8" ...
-
降级 Python 至 3.11(关键!)
Apache 2.4.62下载Apache 2.4.62 官方 tar.gz 源码包是 Linux 及类 Unix 系统构建 Web 服务器的核心基础。通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
- 卸载 Python 3.12,安装 Python 3.11.9(带 pip)。
- 更新 VS Code Python Kernel:
- 在 VS Code 中按 Ctrl+Shift+P → 输入 Python: Select Interpreter → 选择 Python 3.11 路径(如 C:\Users\user\AppData\Local\Programs\Python\Python311\python.exe)。
- 更新 PYTHONPATH(若手动配置):
setx PYTHONPATH "%SPARK_HOME%\python;%SPARK_HOME%\python\lib\py4j-0.10.9.7-src.zip" /M
-
验证 Spark 环境连通性
启动 pyspark shell 并执行最小测试:from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("Test") \ .master("local[*]") \ .getOrCreate() # 创建测试 DataFrame df = spark.createDataFrame([(1, "Alice"), (2, "Bob")], ["id", "name"]) df.show() # 此时应正常输出若仍报错,请检查 HADOOP_HOME\bin\winutils.exe 是否与 Hadoop 版本匹配(Spark 3.5.1-bin-hadoop3 要求 winutils for Hadoop 3.x),并确保 winutils.exe 具有执行权限。
⚠️ 注意事项与避坑提示
- 勿混用 pip 安装的 PySpark 与本地 Spark 二进制包:您已通过 pip install pyspark 安装,但同时又设置了 SPARK_HOME 指向本地解压包。这会导致类路径冲突。强烈建议统一使用本地包:卸载 pip 版本 pip uninstall pyspark,并确保 PYTHONPATH 正确指向 %SPARK_HOME%\python 及 py4j ZIP。
- SPARK_LOCAL_IP 不是必需项:仅在多网卡或 Docker 环境下需要,本地开发可删除该变量。
-
Windows 权限问题:若 show() 后卡住无响应,检查 C:\tmp\hive 目录是否存在且可写(Spark 默认使用此路径作为临时目录),或显式配置:
spark = SparkSession.builder \ .config("spark.sql.warehouse.dir", "file:///C:/spark-warehouse") \ .config("spark.driver.host", "127.0.0.1") \ .getOrCreate()
完成上述配置后,.show() 将恢复稳定输出。Spark 的版本兼容性不是“能跑就行”,而是“必须精准对齐”。坚持使用官方认证组合,是避免 90% 连接类错误的黄金法则。

















