问题描述
我无法在Jupyter笔记本中的导入下运行。
findspark.init('home/ubuntu/spark-3.0.0-bin-hadoop3.2')
出现以下错误:
---------------------------------------------------------------------------
~/.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
我确实安装了 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
解决方法
错误消息表明findinit
在定位SPARK_HOME
目录时遇到问题。
我浏览了findinit
的源代码,这是一个非常简单的错误。
背景
代码要做的第一件事是指定变量spark_python
是您的SPARK_HOME路径,后跟/python
。
接下来,代码使用glob
模块查找py4j路径,该模块查找与模式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
(我组成了py4j的版本号基于我的,因此您的版本可能会略有不同)。现在,通过选择第一个元素,从glob操作返回的列表中获取py4j路径。这就是为什么该错误为IndexError的原因,并且当py4j路径不存在时会发生,该路径本身仅依赖于正确指定的SPARK_HOME。
解决问题
唯一的罪魁祸首是SPARK_HOME的规范,正如您已经说过的那样,它是从〜/ .bashrc文件读取到环境变量中的。因此,要检查的三件事是:
- 您的SPARK_HOME路径正确(检查是否存在)
- 您在
/home/ubuntu/spark-3.0.0-bin-hadoop3.2/python/lib/
中有一个 py4j .zip文件 - 〜/ .bashrc文件中的SPARK_HOME路径规范中没有任何格式问题
我在导出的路径周围使用引号,例如export SPARK_HOME="/home/ubuntu/spark-3.0.0-bin-hadoop3.2"
,但不确定是否会有所不同。
检查所安装的spark版本是否与您在SPARK_HOME名称下声明的版本相同
例如(在Google Colab中),我已经安装:
!wget -q https://downloads.apache.org/spark/spark-3.0.1/spark-3.0.1-bin-hadoop3.2.tgz
然后我声明:
os.environ["SPARK_HOME"] = "/content/spark-3.0.1-bin-hadoop3.2"
请确保 spark-3.0.1-bin-hadoop3.2 在两个地方都必须相同
,您可以使用 JupiterLab 代替 GoogleColab,它也可以解决问题。 使用相同的代码..