You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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版本:

  1. 进入Spark安装目录的conf文件夹,复制模板文件:
    cd $SPARK_HOME/conf
    cp spark-env.sh.template spark-env.sh
    
  2. 编辑spark-env.sh,添加以下两行:
    export PYSPARK_PYTHON=/usr/bin/python3.7
    export PYSPARK_DRIVER_PYTHON=/usr/bin/python3.7
    
  3. 集群环境注意事项:
    • 所有Worker节点必须安装Python3.7
    • 每个Worker节点都要配置相同的环境变量,或者修改各自的Spark配置文件

额外提醒

  • 务必确认Python路径的正确性,避免用相对路径或错误路径
  • 集群环境下,Worker节点的Python版本、路径必须和Driver完全一致
  • 如果用Anaconda虚拟环境,要指定虚拟环境内的Python路径,比如/home/yourname/anaconda3/envs/your_env/bin/python

内容的提问来源于stack exchange,提问作者Johnny

火山引擎 最新活动