Windows10下PySpark调用distinct触发Py4JJavaError的解决求助
问题解决:Windows10下Spark RDD distinct方法触发Py4JJavaError
问题重现
在Windows10的Jupyter Notebook中,Spark Session可正常创建,普通RDD的collect()操作能执行,但调用distinct()时抛出Py4JJavaError,已尝试配置org.apache.spark.serializer.KryoSerializer但无效。
示例代码:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("DistinctTest") \ .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") \ .master("local[*]") \ .getOrCreate() sc = spark.sparkContext rdd = sc.parallelize([1,2,2,3,3,3]) rdd.distinct().collect() # 此处触发Py4JJavaError
典型报错堆栈片段:
Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.collectAndServe. : org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 1 times, most recent failure: Lost task 0.0 in stage 0.0 (TID 0, localhost, executor driver): java.io.IOException: Cannot run program "python": CreateProcess error=2, 系统找不到指定的文件。
核心原因
Windows环境下,Spark执行distinct()这类需要启动子任务的操作时,无法正确找到Python解释器路径:
- 默认Spark会调用
python命令,但Windows系统中Python可执行文件可能是python.exe/python3.exe,且未在环境变量中正确映射 - Jupyter Notebook的Python内核与Spark配置的Python环境不匹配
解决方案
- 显式指定Spark的Python解释器路径
在构建SparkSession时,添加spark.pyspark.python配置项,指向你的Python可执行文件的绝对路径:
spark = SparkSession.builder \ .appName("DistinctTest") \ .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") \ .config("spark.pyspark.python", "C:/Users/YourName/AppData/Local/Programs/Python/Python39/python.exe") # 替换为实际路径 .master("local[*]") \ .getOrCreate()
- 检查并修复系统环境变量
- 将Python安装目录(比如
C:/Users/YourName/AppData/Local/Programs/Python/Python39)添加到系统PATH环境变量 - 在命令行中执行
python --version,确认能正常返回版本信息,确保python命令可被系统识别
- 验证环境一致性
- 如果使用Anaconda/Miniconda环境,先激活目标环境,再启动Jupyter Notebook,确保Jupyter内核与Spark使用的Python环境一致
- 检查Spark版本与Python版本的兼容性:Spark 3.x要求Python 3.6及以上版本
- 简化模式测试
暂时将master("local[*]")改为master("local")(单线程模式),测试distinct()是否能正常执行,排除多线程环境下的路径冲突问题
内容的提问来源于stack exchange,提问作者alejomarchan
相关产品推荐
相关产品推荐

