Python 3.12中使用PySpark Spark Connect遇distutils缺失错误如何解决?
问题:Python 3.12下PySpark Spark Connect因distutils缺失报错的解决办法
我在Python 3.12环境中,尝试用PySpark的Spark Connect连接远程Spark集群,代码如下:
ingress_ep = "..." access_token = "..." conn_string = f"sc://{ingress_ep}/;token={access_token}" spark = SparkSession.builder.remote(conn_string).getOrCreate()
运行后出现ModuleNotFoundError,报错信息如下:
--------------------------------------------------------------------------- ModuleNotFoundError Traceback (most recent call last) Cell In[13], line 11 9 conn_string = f"sc://{ingress_ep}/;token={access_token}" 10 print(conn_string) ---> 11 spark = SparkSession.builder.remote(conn_string).getOrCreate() File c:\Users\...\venv2\Lib\site-packages\pyspark\sql\session.py:464, in SparkSession.Builder.getOrCreate(self) 458 if ( 459 "SPARK_CONNECT_MODE_ENABLED" in os.environ 460 or "SPARK_REMOTE" in os.environ 461 or "spark.remote" in opts 462 ): 463 with SparkContext._lock: --> 464 from pyspark.sql.connect.session import SparkSession as RemoteSparkSession 466 if ( 467 SparkContext._active_spark_context is None 468 and SparkSession._instantiatedSession is None 469 ): 470 url = opts.get("spark.remote", os.environ.get("SPARK_REMOTE")) File c:\Users\...\venv2\Lib\site-packages\pyspark\sql\connect\session.py:19 1 # 2 # Licensed to the Apache Software Foundation (ASF) under one or more 3 # contributor license agreements. See the NOTICE file distributed with ... ---> 24 from distutils.version import LooseVersion 26 try: 27 import pandas ModuleNotFoundError: No module named 'distutils'
已知Python 3.12移除了distutils,已安装setuptools并设置环境变量SETUPTOOLS_USE_DISTUTILS='local',但问题依旧,且无法降级Python版本,求解决办法。
解决办法
- 安装第三方distutils包:Python官方移除distutils后,有第三方维护的兼容版本可通过pip安装:
pip install distutils - 升级PySpark到兼容版本:PySpark 3.5.0及以上版本已适配Python 3.12,修复了distutils依赖问题,执行升级命令:
pip install --upgrade pyspark - 手动创建distutils软链接(Linux/macOS):如果安装第三方包无效,可从setuptools中找到内置的_distutils模块,创建软链接到Python的site-packages目录:
- 找到setuptools的_distutils路径,示例:
/usr/local/lib/python3.12/site-packages/setuptools/_distutils - 进入Python site-packages目录,执行软链接命令:
ln -s /usr/local/lib/python3.12/site-packages/setuptools/_distutils distutils
- 找到setuptools的_distutils路径,示例:
- 临时修改PySpark源码(不推荐):找到报错的
pyspark/sql/connect/session.py文件,将第24行的from distutils.version import LooseVersion替换为from setuptools._distutils.version import LooseVersion,此方法仅作应急,PySpark升级后会失效。
内容的提问来源于stack exchange,提问作者Kai Roesner
相关产品推荐
相关产品推荐

