PySpark写入失败:Worker与Driver Python版本不匹配求助
问题
PySpark任务执行写入JDBC命令时失败,此前Pandas DataFrame创建、方法应用均正常。报错信息:
[PYTHON_VERSION_MISMATCH] Python in worker has different version (3, 11) than that in driver 3.9, PySpark cannot run with different minor versions
环境与尝试情况:
- 编辑器使用Python 3.9,Pandas 1.5.3与PySpark 3.5.0版本兼容
- 已尝试在Spark构造器中指定Python版本、设置环境变量,问题未解决
- 切换至Python 3.11时,PySpark因版本不支持无法导入
相关代码:
spark = SparkSession.builder \ .master("local[*]") \ .appName("Test Connection") \ .config('spark.jars', '/usr/local/bin/postgresql-42.7.3.jar') \ .config("spark.executorEnv.PYSPARK_PYTHON", "/usr/local/bin/python3.9") \ .config("spark.executorEnv.PYSPARK_DRIVER_PYTHON", "/usr/local/bin/python3.9") \ .config("spark.pyspark.python", "/usr/local/bin/python3.9") \ .config("spark.pyspark.driver.python", "/usr/local/bin/python3.9") \ .getOrCreate() df = pandas.read_csv(data_file) df['title'] = df['title'].apply(lambda title: decode_from_base64(title)) df_spark = spark.createDataFrame(df) df_spark = df_spark.withColumn("snapshot_time(UTC)",df_spark["snapshot_time(UTC)"].cast(TimestampType())) df_spark_schema = spark.createDataFrame(df_spark.rdd, schema=TABLE_SCHEMA) df_spark_schema = df_spark.withColumnRenamed("snapshot_time(UTC)", "snapshot_time_utc") df_spark_schema.write.jdbc(url=f'jdbc:postgresql://{{ip_addr}}:{{port}}/{{db}}', table=main_table, properties=connection, mode='append') # 此处报错
解决方案
以下是可行的排查和解决步骤:
提前设置系统全局环境变量
在启动Python脚本前,先配置环境变量,确保Worker进程启动时能读取到正确的Python路径:
Linux/Mac终端执行:export PYSPARK_PYTHON=/usr/local/bin/python3.9 export PYSPARK_DRIVER_PYTHON=/usr/local/bin/python3.9Windows命令行执行:
set PYSPARK_PYTHON=C:\path\to\python3.9.exe set PYSPARK_DRIVER_PYTHON=C:\path\to\python3.9.exe修改Spark全局配置文件
找到Spark安装目录下的conf/spark-env.sh(Linux/Mac)或spark-env.cmd(Windows),添加配置:export PYSPARK_PYTHON=/usr/local/bin/python3.9 export PYSPARK_DRIVER_PYTHON=/usr/local/bin/python3.9这会让所有Spark任务默认使用指定版本,避免会话级配置失效。
验证Python路径有效性
执行/usr/local/bin/python3.9 --version确认路径正确,排查是否存在软链接指向Python3.11的情况。如果路径错误,替换为Python3.9的实际安装路径(比如虚拟环境内的路径)。简化SparkSession配置
移除重复的executorEnv配置,保留关键配置避免冲突:spark = SparkSession.builder \ .master("local[*]") \ .appName("Test Connection") \ .config('spark.jars', '/usr/local/bin/postgresql-42.7.3.jar') \ .config("spark.pyspark.python", "/usr/local/bin/python3.9") \ .config("spark.pyspark.driver.python", "/usr/local/bin/python3.9") \ .getOrCreate()检查虚拟环境一致性
如果使用虚拟环境,确保Worker进程也能访问同一虚拟环境,直接使用虚拟环境内的Python路径(比如~/venv/bin/python3.9),或在Spark配置文件中添加虚拟环境激活命令。
内容的提问来源于stack exchange,提问作者Joseph W
相关产品推荐
相关产品推荐

