错误:无法找到 py4j,您的 SPARK_HOME 可能配置不正确

Sus*_*098 11 python ubuntu py4j pyspark

我无法在 Jupyter 笔记本中运行以下导入。

findspark.init('home/ubuntu/spark-3.0.0-bin-hadoop3.2')
Run Code Online (Sandbox Code Playgroud)

出现以下错误:

    ---------------------------------------------------------------------------
~/.local/lib/python3.6/site-packages/findspark.py in init(spark_home, python_path, edit_rc, edit_profile)
    144     except IndexError:
    145         raise Exception(
--> 146             "Unable to find py4j, your SPARK_HOME may not be configured correctly"
    147         )
    148     sys.path[:0] = [spark_python, py4j]

Exception: Unable to find py4j, your SPARK_HOME may not be configured correctly
Run Code Online (Sandbox Code Playgroud)

我确实安装了py4j并尝试将以下行添加到 ~/.bashrc 中

export SPARK_HOME=/home/ubuntu/spark-3.0.0-bin-hadoop3.2
export PYTHONPATH=$SPARK_HOME/python/:$PYTHONPATH
export PYTHONPATH=$SPARK_HOME/python/lib/py4j-0.10.9-src.zip:$PYTHONPATH
Run Code Online (Sandbox Code Playgroud)

小智 7

检查您安装的spark版本是否与您在SPARK_HOME名称下声明的版本相同

例如(在 Google Colab 中),我安装了:

!wget -q https://downloads.apache.org/spark/spark-3.0.1/spark-3.0.1-bin-hadoop3.2.tgz
Run Code Online (Sandbox Code Playgroud)

然后我声明:

os.environ["SPARK_HOME"] = "/content/spark-3.0.1-bin-hadoop3.2"
Run Code Online (Sandbox Code Playgroud)

spark-3.0.1-bin-hadoop3.2在两个地方必须相同


use*_*471 3

该错误消息表明findinit无法找到您的SPARK_HOME目录。

我查看了源代码findinit,这是一个非常简单的错误。

背景

代码所做的第一件事是指定一个变量spark_python是您的 SPARK_HOME 路径,后跟/python.

接下来,代码使用该模块查找 py4j 路径,该模块会查找与您的情况应该等同的glob模式匹配的所有路径名(我根据我的版本号编写了 py4j 版本号,因此您的版本号可能略有不同)。现在,它通过选择第一个元素从 glob 操作返回的列表中获取 py4j 路径。这就是为什么错误是 IndexError 的原因,并且当 py4j 路径不存在时会发生这种情况,而 py4j 路径本身仅依赖于正确指定 SPARK_HOME 。os.path.join(spark_python,"lib","py4j-*.zip")/home/ubuntu/spark-3.0.0-bin-hadoop3.2/python/lib/py4j-0.10.7-src.zip

解决问题

唯一的罪魁祸首是 SPARK_HOME 的规范,正如您所说,它是从 ~/.bashrc 文件中读入环境变量的。所以要检查的三件事是:

  1. 您的 SPARK_HOME 路径是否正确(检查它是否存在)
  2. 您有一个py4j .zip 文件/home/ubuntu/spark-3.0.0-bin-hadoop3.2/python/lib/
  3. ~/.bashrc 文件中的 SPARK_HOME 路径规范不存在任何格式问题

我在导出的路径周围使用引号,export SPARK_HOME="/home/ubuntu/spark-3.0.0-bin-hadoop3.2"但我不确定这是否会产生影响。