本地PySpark中df.show()报错:Python Worker连接超时求助
问题重现
运行以下PySpark代码时,df.show()抛出Py4JJavaError,核心错误为Python Worker无法连接回Java端,触发SocketTimeoutException;相同代码在Colab中可正常执行。
代码示例:
from pyspark.sql import SparkSession spark = SparkSession.builder.master("local[*]").appName("Test").getOrCreate() df = spark.createDataFrame([ (14, "Tom"), (23, "Alice"), (16, "Bob")], ["age", "name"]) print(df) df.show()
环境版本:
- Python 3.12.0
- PySpark 3.5.0
- OpenJDK 21.0.1
解决步骤
降级Python版本至3.11.x
PySpark 3.5.0对Python 3.12的兼容性尚未完善,Python 3.12的底层API变更会导致Spark Python Worker的通信逻辑异常。切换到Python 3.11.x系列稳定版本(如3.11.6),重新安装PySpark后即可解决大部分此类问题。显式指定Python解释器路径
在构建SparkSession时,通过配置参数指定正确的Python解释器路径,避免Spark误调用不兼容的版本:from pyspark.sql import SparkSession spark = SparkSession.builder.master("local[*]")\ .appName("Test")\ .config("spark.python.executable", "/path/to/your/python3.11")\ .getOrCreate()替换路径为本地Python 3.11的实际安装路径(Windows示例:
C:/Python311/python.exe;Linux/macOS示例:/usr/bin/python3.11)。调大Spark网络超时参数
若因本地资源调度或网络延迟导致超时,可增大Worker通信的超时阈值:spark = SparkSession.builder.master("local[*]")\ .appName("Test")\ .config("spark.executor.heartbeatInterval", "30s")\ .config("spark.network.timeout", "120s")\ .getOrCreate()验证Java环境配置
确保JAVA_HOME环境变量正确指向OpenJDK 21的安装目录,在VS Code终端执行echo $JAVA_HOME(Linux/macOS)或echo %JAVA_HOME%(Windows)确认配置有效。Spark依赖Java环境的正确配置,环境变量缺失或错误会引发跨进程通信异常。
内容的提问来源于stack exchange,提问作者taksin taeprasert

