当初始化SparkContext时出现pyspark错误不存在于JVM错误。

28
我正在使用EMR上的Spark并编写一个Pyspark脚本,当我尝试时出现了错误。
from pyspark import SparkContext
sc = SparkContext()
这是错误信息。
File "pyex.py", line 5, in <module>
    sc = SparkContext()   File "/usr/local/lib/python3.4/site-packages/pyspark/context.py", line 118, in __init__
    conf, jsc, profiler_cls)   File "/usr/local/lib/python3.4/site-packages/pyspark/context.py", line 195, in _do_init
    self._encryption_enabled = self._jvm.PythonUtils.getEncryptionEnabled(self._jsc)   File "/usr/local/lib/python3.4/site-packages/py4j/java_gateway.py", line 1487, in __getattr__
    "{0}.{1} does not exist in the JVM".format(self._fqn, name)) py4j.protocol.Py4JError: org.apache.spark.api.python.PythonUtils.getEncryptionEnabled does not exist in the JVM
我发现这个答案说我需要导入sparkcontext但这也不起作用。

你关闭了SparkContext吗?另外,能展示一下完整的代码吗? - pvy4917
这是在我使用它之前发生的。我正在创建它并且出现了错误。 - thebeancounter
如果您执行 print(conf),会得到什么结果? - pvy4917
<module 'pyspark.conf' from '/usr/local/lib/python3.4/site-packages/pyspark/conf.py'> - thebeancounter
尝试使用sc = SparkContext(conf) - pvy4917
它不起作用,所有的EMR设置都是通过环境变量进行的,并不在配置文件中。 - thebeancounter
10个回答

33

PySpark 最近发布了2.4.0版本,但是与此新版本相对应的 Spark 没有稳定的版本。尝试降级到 pyspark 2.3.2 版本,这对我有帮助。

编辑:更明确地说,你的 PySpark 版本需要与下载的 Apache Spark 版本相同,否则可能会遇到兼容性问题。

使用以下命令检查 pyspark 版本:

pip freeze


3
那他们发布PySpark 2.4.0版本是为了什么? - shubhamgoel27
当我发布这篇文章时,https://spark.apache.org/downloads.html 上还没有2.4.0版本可供下载,只有2.3.2版本。只要pyspark版本==apache sparks版本,你就可以使用了。我会更新这篇文章。 - svw
这让我感到困惑。当我使用pip install pyspark==2.4.0或任何版本时,它都会在我的site-libs中安装一个Spark版本。我的用例是尝试在不安装本地Spark的情况下使用流包中的KafkaUtils。即使这样做,仍然会出现py4j网关错误,尝试加载类。Python pyspark安装附带的Spark版本如何在没有其他任何参与的情况下尝试使用它而导致失败? - Penumbra

10
你需要设置以下环境变量来设置Spark路径和Py4j路径。例如在~/.bashrc文件中:
export SPARK_HOME=/home/hadoop/spark-2.1.0-bin-hadoop2.7
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.10.4-src.zip:$PYTHONPATH
export PATH=$SPARK_HOME/bin:$SPARK_HOME/python:$PATH

在你的文件顶部使用findspark:

import findspark
findspark.init()

9
我刚在我的Windows设备上进行了新的pyspark安装,遇到了完全相同的问题。似乎以下操作有所帮助:
进入系统环境变量并添加PYTHONPATH,值为:%SPARK_HOME%\python;%SPARK_HOME%\python\lib\py4j-<version>-src.zip:%PYTHONPATH%,请检查您的spark/python/lib文件夹中的py4j版本。
我认为这个方法有效是因为当我使用conda安装pyspark时,它也下载了一个py4j版本,该版本可能与特定版本的spark不兼容,因此似乎需要自己打包一个版本。

1
没错,@mugurkt。在你的回答指导下,我不得不删除了anaconda navigator安装的与py4j版本不兼容的pyspark,然后通过命令行提示符重新安装了'pip install pyspark'的pyspark,现在它对我来说运行良好。 - Laenka-Oss
2
当然,对于那些使用*nix的人来说,这意味着:export PYTHONPATH=$SPARK_HOME\python:$SPARK_HOME\python\lib\py4j-<version>-src.zip:$PYTHONPATH - Metropolis

3

不必编辑环境变量,您可以确保Python环境(其中包含pyspark)与Spark文件夹中的\python\lib\字典中存在相同的py4j版本。例如,在我的系统上,对于Spark 2.3.2,在d:\Programs\Spark\python\lib\中存在py4j-0.10.7-src.zip。这是作为Spark存档文件一部分提供的py4j版本。


3

简单来说,这是关于Python和Java无法交流的问题,因为它们用于交流的中介(py4j)不同。我曾经遇到过相同的问题,所有以上的答案都是有效的,如果你正确使用它们的话。你要么定义一个系统变量告诉两个程序应该使用哪个py4j,或者卸载并重新安装,以确保每个程序都在同一个页面上。


3

在 Python 3.7 中不存在 import findspark,请再检查一下。我正在尝试使用 Anaconda Navigator 的 import 选项。 - Abhishek

1
在程序结束时使用SparkContext().stop()来停止这种情况。

1
以下步骤解决了我的问题: - 将其降级为2.3.2 - 添加PYTHONPATH作为系统环境变量,值为%SPARK_HOME%\python;%SPARK_HOME%\python\lib\py4j-<version>-src.zip:%PYTHONPATH% 注意:在上述值中使用正确的版本,不要直接复制。

1

尝试安装Spark 2.4.5版本,并将Spark的主目录路径设置为该版本。即使我在更改版本后也遇到了问题,但最终得到了解决。


1
当我从Anaconda命令提示符下载新版本pip install时,遇到了相同的问题。
当我在代码文件顶部使用时:
import findspark
findspark.init("c:\spark")

这段代码解决了我的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接