py4j.protocol.Py4JError: org.apache.spark.api.python.PythonUtils.getEncryptionEnabled 在 JVM 中不存在

Posted

技术标签:

【中文标题】py4j.protocol.Py4JError: org.apache.spark.api.python.PythonUtils.getEncryptionEnabled 在 JVM 中不存在【英文标题】:py4j.protocol.Py4JError: org.apache.spark.api.python.PythonUtils.getEncryptionEnabled does not exist in the JVM 【发布时间】:2019-04-12 13:17:00 【问题描述】:

我目前在 JRE:1.8.0_181,Python:3.6.4,spark:2.3.2

我正在尝试在 Python 中执行以下代码:

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('Basics').getOrCreate()

这失败并出现以下错误:

spark = SparkSession.builder.appName('Basics').getOrCreate() 回溯(最近一次通话最后): 文件“”,第 1 行,在 文件“C:\Tools\Anaconda3\lib\site-packages\pyspark\sql\session.py”,第 173 行,在 getOrCreate sc = SparkContext.getOrCreate(sparkConf) 文件“C:\Tools\Anaconda3\lib\site-packages\pyspark\context.py”,第 349 行,在 getOrCreate SparkContext(conf=conf 或 SparkConf()) init 中的文件“C:\Tools\Anaconda3\lib\site-packages\pyspark\context.py”,第 118 行 conf、jsc、profiler_cls) _do_init 中的文件“C:\Tools\Anaconda3\lib\site-packages\pyspark\context.py”,第 195 行 self._encryption_enabled = self._jvm.PythonUtils.getEncryptionEnabled(self._jsc) getattr 中的文件“C:\Tools\Anaconda3\lib\site-packages\py4j\java_gateway.py”,第 1487 行 "0.1 在 JVM 中不存在".format(self._fqn, name))

有人知道这里可能存在什么问题吗?

在这里感谢任何帮助或反馈。谢谢!

【问题讨论】:

***.com/questions/53161939/… 你可以试试这个:***.com/a/54881624/1316649 它对我有用。 【参考方案1】:

如@pyspark error does not exist in the jvm error when initializing SparkContext所述,添加PYTHONPATH环境变量(值为:

%SPARK_HOME%\python;%SPARK_HOME%\python\lib\py4j-<version>-src.zip:%PYTHONPATH%, - 只需检查您的spark/python/lib 文件夹中的py4j 版本)有助于解决此问题。

【讨论】:

我们肯定应该在%SPARK_HOME%\python 之后包含一个分号吗? 我已经按照上面的相同步骤,它对我有用。只需确保您下载的 spark 版本与使用 pip 命令安装的版本相同。设置此路径后,只需重新启动系统即可。 我必须把斜线放在另一个方向才能让它工作,但这确实成功了。例如。 PYTHONPATH=/opt/spark/python;/opt/spark/python/lib/py4j-0.10.9-src.zip:%$ 我可以确认这解决了我在 WSL2 Ubuntu 上的问题。 我首先按照上面的相同步骤,但我仍然得到同样的错误。我的情况的根本原因是我的本地 py4j 版本与 spark/python/lib 文件夹中的不同。我尝试 pip 安装与本地版本相同的版本,并检查上面的步骤,它对我有用。谢谢。【参考方案2】:

使用 findspark 有望解决问题:

安装 findspark

$pip install findspark

在你的代码中使用:

import findspark
findspark.init() 

您可以选择在上面的init 方法中指定“/path/to/spark”; findspark.init("/path/to/spark")

【讨论】:

是的,你可以在导入pyspark之前findspark.init()【参考方案3】:

解决方案 #1。检查您的环境变量

由于未正确设置环境变量,您将收到“py4j.protocol.Py4JError: org.apache.spark.api.python.PythonUtils.getEncryptionEnabled 在 JVM 中不存在”。

检查您是否在 .bashrc 文件中正确设置了环境变量。对于 Unix 和 Mac,变量应该如下所示。您可以在主路径上找到 .bashrc 文件。

注意:请勿复制粘贴以下行,因为您的 Spark 版本可能与下面提到的不同。

export SPARK_HOME=/opt/spark-3.0.0-bin-hadoop2.7
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.10.9-src.zip:$PYTHONPATH
export PATH=$SPARK_HOME/bin:$SPARK_HOME/python:$PATH

如果你在windows上运行,打开环境变量窗口,在下面添加/更新。

SPARK_HOME  =>  /opt/spark-3.0.0-bin-hadoop2.7
PYTHONPATH  =>  %SPARK_HOME%/python;%SPARK_HOME%/python/lib/py4j-0.10.9-src.zip;%PYTHONPATH%
PATH  => %SPARK_HOME%/bin;%SPARK_HOME%/python;%PATH%

设置环境变量后,重新启动工具或命令提示符。

解决方案 #2。使用 findspark

通过运行 $pip install findspark 安装 findspark 包并将以下行添加到您的 pyspark 程序中

import findspark
findspark.init() 
# you can also pass spark home path to init() method like below
# findspark.init("/path/to/spark")

解决方案 #3。将 pyspark 和 py4j 模块复制到 Anaconda lib

有时在更改/升级 Spark 版本后,由于 pyspark 版本与 anaconda lib 中可用的 pyspark 之间的版本不兼容,您可能会收到此错误。为了改正

注意:从 zip 文件中复制指定的文件夹,并确保按照开头所述设置正确的环境变量。

从以下位置复制 py4j 文件夹:

C:\apps\opt\spark-3.0.0-bin-hadoop2.7\python\lib\py4j-0.10.9-src.zip\

C:\Programdata\anaconda3\Lib\site-packages\.

然后,复制 pyspark 文件夹:

C:\apps\opt\spark-3.0.0-bin-hadoop2.7\python\lib\pyspark.zip\

C:\Programdata\anaconda3\Lib\site-packages\

有时,您可能需要重新启动系统才能影响环境变量。

感谢:https://sparkbyexamples.com/pyspark/pyspark-py4j-protocol-py4jerror-org-apache-spark-api-python-pythonutils-jvm/

【讨论】:

【参考方案4】:

您只需要安装旧版本的 pyspark 即可。此版本适用于“pip install pyspark==2.4.7”

【讨论】:

这很有帮助! PySpark 版本需要与 Spark 版本匹配。【参考方案5】:

在 Windows 上遇到同样的问题,我发现我的 Python 的 py4jpyspark 版本与 spark 预期的不同。 通过复制 zip 中的 python 模块解决:py4j-0.10.8.1-src.zippyspark.zip(在 spark-3.0.0-preview2 中找到-bin-hadoop2.7\python\lib) 到 C:\Anaconda3\Lib\site-packages

【讨论】:

【参考方案6】:

我遇到了同样的问题。在我使用 spark 2.4.6 的情况下,安装与 spark 相同版本的 pyspark 2.4.6 或 2.4.x 解决了问题,因为 pyspark 3.0.1(pip install pyspark 将安装最新版本)引发了问题。

【讨论】:

【参考方案7】:

我最近遇到了这个问题。 错误是 - 我正在打开普通的 jupyter 笔记本。 始终打开 Anaconda Prompt -> 输入 'pyspark' -> 它将自动为您打开 Jupyter notebook 。 之后,您将不会收到此错误。

【讨论】:

【参考方案8】:

如果使用 pycharm - 下载火花 2.4.4 - 设置/项目结构/添加内容根/添加py4j.0.10.8.1.zip pyspark.zip 在 spark.2.4.4/python/lib 中

【讨论】:

【参考方案9】:

如果您安装了 pip pyspark 3.1 并且您的本地 spark 是 2.4,则可能会发生这种情况(我的意思是版本不兼容) 就我而言,为了克服这个问题,我卸载了 spark 3.1 并切换到 pip install pyspark 2.4。

我的建议是在这里检查版本不兼容问题以及其他答案。

【讨论】:

【参考方案10】:

如果你更新了 pyspark 或 spark

如果像我一样,问题是在您更新两者之一之后发生的,并且您不知道 Pyspark 和 Spark 版本需要匹配,正如 Pyspark PyPi 存储库所说:

注意:如果您将它与 Spark 独立集群一起使用,您必须确保 版本(包括次要版本)匹配,否则您可能会遇到奇怪的错误。

因此升级/降级 Pyspark/Spark 以匹配它们的版本以解决问题。

升级 Spark,请关注:https://sparkbyexamples.com/pyspark/pyspark-py4j-protocol-py4jerror-org-apache-spark-api-python-pythonutils-jvm/

【讨论】:

【参考方案11】:

如果在本地使用 Spark 和 AWS Glue 库 (https://github.com/awslabs/aws-glue-libs),请确保 Spark、PySpark 和 AWS Glue 库的版本都正确对齐。截至目前,目前有效的组合是:

aws-glue-libs branch Glue Version Spark Version
glue-0.9 0.9 2.2.1
glue-1.0 1.0 2.4.3
glue-2.0 2.0 2.4.3
master 3.0 3.1.1

【讨论】:

【参考方案12】:

如果之前的答案还不清楚,您的 pyspark 包版本必须与安装的 Apache Spark 版本相同。

例如,我使用 Ubuntu 和 PySpark 3.2。在环境变量(bashrc)中:

export SPARK_HOME="/home/ali/spark-3.2.0-bin-hadoop3.2"
export PYTHON_PATH=$SPARK_HOME/python:$PYTHON_PATH

【讨论】:

以上是关于py4j.protocol.Py4JError: org.apache.spark.api.python.PythonUtils.getEncryptionEnabled 在 JVM 中不存在的主要内容,如果未能解决你的问题,请参考以下文章