PySpark执行代码报错:Worker与Driver Python版本不一致求助
解决PySpark Driver与Worker Python版本不一致的问题
问题场景
我在执行以下PySpark代码时:
df = spark.read.parquet('xxx') tmstmp = df['timestamp'] spark.conf.set("spark.sql.session.timeZone", "Singapore") time_df = spark.createDataFrame([('tmstmp',)], ['unix_time']) time_df.select(from_unixtime('unix_time').alias('ts')).collect() df['timestamp'] = time_df spark.conf.unset("spark.sql.session.timeZone")
执行到time_df.select(from_unixtime('unix_time').alias('ts')).collect()这一行时抛出异常:
Exception: Python in worker has different version 2.7 than that in driver 3.7, PySpark cannot run with different minor versions.Please check environment variables PYSPARK_PYTHON and PYSPARK_DRIVER_PYTHON are correctly set.
错误翻译:
异常:Worker中的Python版本为2.7,与Driver中的3.7版本不一致,PySpark无法在不同次版本下运行,请检查环境变量PYSPARK_PYTHON和PYSPARK_DRIVER_PYTHON是否设置正确。
问题根源
PySpark对Driver(驱动节点)和Worker(工作节点)的Python版本一致性要求非常严格——必须使用相同的次版本(比如3.7.x之间兼容,但3.7和2.7完全不行)。你的Driver用的是Python3.7,但Worker节点默认调用了系统自带的Python2.7,版本不匹配直接触发了这个报错。
解决方案
1. 临时生效(当前会话/脚本)
在启动PySpark或运行脚本前,指定Python3.7的绝对路径:
- 终端启动前设置:
先通过which python3.7确认Python3.7的绝对路径,再执行:export PYSPARK_PYTHON=/usr/bin/python3.7 export PYSPARK_DRIVER_PYTHON=/usr/bin/python3.7 # 之后启动pyspark或运行脚本 pyspark # 或者 python your_script.py - 脚本内设置(必须在创建SparkSession之前):
import os # 替换成你实际的Python3.7路径 os.environ['PYSPARK_PYTHON'] = '/usr/bin/python3.7' os.environ['PYSPARK_DRIVER_PYTHON'] = '/usr/bin/python3.7' # 之后再导入Spark模块并创建会话 from pyspark.sql import SparkSession from pyspark.sql.functions import from_unixtime spark = SparkSession.builder.appName("TimeConversionApp").getOrCreate() # 顺便修正你代码里的两个小问题: df = spark.read.parquet('xxx') tmstmp = df['timestamp'] spark.conf.set("spark.sql.session.timeZone", "Singapore") # 原来传的是字符串'tmstmp',要改成变量tmstmp time_df = spark.createDataFrame([(tmstmp,)], ['unix_time']) time_df.select(from_unixtime('unix_time').alias('ts')).collect() # PySpark DataFrame不可变,不能直接赋值,要用withColumn生成新DataFrame df = df.withColumn('timestamp', time_df['ts']) spark.conf.unset("spark.sql.session.timeZone")
2. 永久生效(全局/集群)
修改Spark配置文件,让所有会话默认使用指定Python版本:
- 进入Spark安装目录的
conf文件夹,复制模板文件:cd $SPARK_HOME/conf cp spark-env.sh.template spark-env.sh - 编辑
spark-env.sh,添加以下两行:export PYSPARK_PYTHON=/usr/bin/python3.7 export PYSPARK_DRIVER_PYTHON=/usr/bin/python3.7 - 集群环境注意事项:
- 所有Worker节点必须安装Python3.7
- 每个Worker节点都要配置相同的环境变量,或者修改各自的Spark配置文件
额外提醒
- 务必确认Python路径的正确性,避免用相对路径或错误路径
- 集群环境下,Worker节点的Python版本、路径必须和Driver完全一致
- 如果用Anaconda虚拟环境,要指定虚拟环境内的Python路径,比如
/home/yourname/anaconda3/envs/your_env/bin/python
内容的提问来源于stack exchange,提问作者Johnny




