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 的 py4j 和 pyspark 版本与 spark 预期的不同。 通过复制 zip 中的 python 模块解决:py4j-0.10.8.1-src.zip 和 pyspark.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 中不存在的主要内容,如果未能解决你的问题,请参考以下文章