Mac环境下使用Pipenv安装PySpark后运行pyspark命令报错求助
问题描述
我在Mac上用Pipenv管理虚拟环境,步骤如下:
- 用brew安装了openJDK 11
- 在
.zprofile中配置了路径:eval "$(/opt/homebrew/bin/brew shellenv)" export JAVA_HOME="/opt/homebrew/opt/openjdk@11" export PYSPARK_PYTHON="/opt/homebrew/opt/python@3.10/bin/python3.10" export PATH="/opt/homebrew/opt/python@3.10/bin:$PATH" - 用pip安装了
pipenv - 执行
pipenv install -e .安装所有依赖,其中包含PySpark 3.3.0 - 激活虚拟环境
pipenv shell - 在VS Code中运行所有测试都正常通过
但在激活的shell中运行pyspark命令时,出现以下错误:
/Users/<user_name>/.local/share/virtualenvs/<repo_name>/bin/pyspark: line 24: /bin/load-spark-env.sh: No such file or directory /Users/<user_name>/.local/share/virtualenvs/<repo_name>/bin/pyspark: line 68: /bin/spark-submit: No such file or directory /Users/<user_name>/.local/share/virtualenvs/<repo_name>/bin/pyspark: line 68: exec: /bin/spark-submit: cannot execute: No such file or directory
实际这些报错的文件(load-spark-env.sh和spark-submit)都在虚拟环境的bin目录下,而不是根目录/bin,请问我哪里操作错了?
原因分析与解决方案
问题根因
通过pip(含Pipenv)安装的PySpark是Python客户端版本,它并不包含完整的独立Spark集群二进制包。虚拟环境中自动生成的pyspark脚本,默认使用了相对路径去查找环境脚本和提交工具,但没有正确关联到PySpark实际安装目录下的bin文件夹,导致错误地去根目录/bin寻找文件,最终触发找不到文件的报错。
具体解决办法
方法1:临时设置SPARK_HOME(最快见效)
在激活的Pipenv Shell中,先定位PySpark的实际安装路径:
pip show pyspark | grep Location
会得到类似这样的路径:Location: /Users/<user_name>/.local/share/virtualenvs/<repo_name>/lib/python3.10/site-packages/pyspark
接着将这个路径设为SPARK_HOME:
export SPARK_HOME=/Users/<user_name>/.local/share/virtualenvs/<repo_name>/lib/python3.10/site-packages/pyspark
设置完成后再运行pyspark,就能正常启动交互式环境了。
如果想让这个配置永久生效,可以把上述export命令添加到你的.zprofile,或者虚拟环境的激活脚本中。
方法2:用python -m pyspark替代pyspark命令
这是更稳妥的方式,直接通过Python模块入口启动PySpark,绕过虚拟环境中路径有问题的pyspark脚本:
python -m pyspark
这个方式不需要额外配置环境变量,就能直接启动PySpark交互环境。
方法3:修改虚拟环境中的pyspark脚本(一劳永逸)
如果你偏好直接用pyspark命令,可以手动修复脚本的路径逻辑:
- 打开虚拟环境中的
pyspark脚本:
vim /Users/<user_name>/.local/share/virtualenvs/<repo_name>/bin/pyspark
- 找到第24行的
/bin/load-spark-env.sh,替换为:
${SPARK_HOME:-$(cd "$(dirname "$0")/../lib/python3.10/site-packages/pyspark" && pwd)}/bin/load-spark-env.sh
(注意把python3.10替换为你实际使用的Python版本)
3. 再找到第68行的/bin/spark-submit,替换为:
${SPARK_HOME:-$(cd "$(dirname "$0")/../lib/python3.10/site-packages/pyspark" && pwd)}/bin/spark-submit
- 保存退出后,重新运行
pyspark即可正常使用。
补充说明
VS Code中的测试能正常通过,是因为测试代码直接调用PySpark的Python API,不需要依赖pyspark命令行脚本的环境加载逻辑,因此不会触发这个路径解析问题。
备注:内容来源于stack exchange,提问作者andKaae

