Spark 错误 - 不支持的类文件主版本
- 2025-03-19 08:56:00
- admin 原创
- 52
问题描述:
我正在尝试在 Mac 上安装 Spark。我使用 home-brew 安装了 spark 2.4.0 和 Scala。我在 anaconda 环境中安装了 PySpark,并使用 PyCharm 进行开发。我已将其导出到我的 bash 配置文件:
export SPARK_VERSION=`ls /usr/local/Cellar/apache-spark/ | sort | tail -1`
export SPARK_HOME="/usr/local/Cellar/apache-spark/$SPARK_VERSION/libexec"
export PYTHONPATH=$SPARK_HOME/python/:$PYTHONPATH
export PYTHONPATH=$SPARK_HOME/python/lib/py4j-0.9-src.zip:$PYTHONPATH
但我无法让它工作。
我怀疑这是由于读取回溯时 Java 版本所致。如果能帮助修复此问题,我将不胜感激。如果我能提供任何除回溯之外有用的信息,请发表评论。
我收到以下错误:
Traceback (most recent call last):
File "<input>", line 4, in <module>
File "/anaconda3/envs/coda/lib/python3.6/site-packages/pyspark/rdd.py", line 816, in collect
sock_info = self.ctx._jvm.PythonRDD.collectAndServe(self._jrdd.rdd())
File "/anaconda3/envs/coda/lib/python3.6/site-packages/py4j/java_gateway.py", line 1257, in __call__
answer, self.gateway_client, self.target_id, self.name)
File "/anaconda3/envs/coda/lib/python3.6/site-packages/py4j/protocol.py", line 328, in get_return_value
format(target_id, ".", name), value)
py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.collectAndServe.
: java.lang.IllegalArgumentException: Unsupported class file major version 55
解决方案 1:
编辑Spark 3.0 支持 Java 11,因此你需要升级
Spark 可在 Java 8/11、Scala 2.12、Python 2.7+/3.4+ 和 R 3.1+ 上运行。自 Spark 3.0.0 起,不再支持 8u92 之前的 Java 8
原始答案
在 Spark 支持 Java 11 或更高版本(希望在最新文档中提及)之前,您必须添加一个标志来将您的 Java 版本设置为 Java 8。
从 Spark 2.4.x 开始
Spark 可在Java 8、Python 2.7+/3.4+ 和 R 3.1+ 上运行。对于 Scala API,Spark 2.4.4 使用 Scala 2.12。您需要使用兼容的 Scala 版本 (2.12.x)
在 Mac/Unix 上,请参阅asdf-java以安装不同的 Java
在 Mac 上,我可以在我.bashrc
的
export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
在 Windows 上,请查看 Chocolately,但实际上只需使用 WSL2 或 Docker 即可运行 Spark。
您也可以设置此项,spark-env.sh
而不是为整个配置文件设置变量。
当然,这意味着你除了现有的 Java 11之外,还需要安装 Java 8
解决方案 2:
使用 Java 11 运行 Jupyter Notebook 和 Spark 时遇到了这个问题。我按照以下步骤安装并配置了 Java 8。
安装Java 8:
$ sudo apt install openjdk-8-jdk
由于我已经安装了 Java 11,因此我使用以下命令将默认 Java 设置为版本 8:
$ sudo update-alternatives --config java
选择 Java 8,然后确认您的更改:
$ java -version
输出应类似于:
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-8u191-b12-2ubuntu0.18.04.1-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
我现在能够在 Jupyter Notebook 中成功运行 Spark。上述步骤基于以下指南:https://www.digitalocean.com/community/tutorials/how-to-install-java-with-apt-on-ubuntu-18-04
解决方案 3:
我发现在脚本开头通过findspark和java8以及os添加spark 位置是最简单的解决方案:
import findspark
import os
spark_location='/opt/spark-2.4.3/' # Set your own
java8_location= '/usr/lib/jvm/java-8-openjdk-amd64' # Set your own
os.environ['JAVA_HOME'] = java8_location
findspark.init(spark_home=spark_location)
解决方案 4:
这里的问题在于 PySpark 的某些功能需要 Java 8。Spark 2.2.1 在 Java 9 及更高版本上存在问题。建议的解决方案是安装 Java 8。
您可以专门安装 java-8,并将其设置为您的默认 java,然后重试。
要安装 Java 8,
sudo apt install openjdk-8-jdk
要更改默认 Java 版本,请按照以下步骤操作。您可以使用命令
update-java-alternatives --list
列出所有可用的 Java 版本。
通过运行以下命令设置默认值:
sudo update-alternatives --config java
选择您想要的 Java 版本。在提供的列表中提供准确的数字。然后检查您的 Java 版本java -version
,它应该已更新。同时设置 JAVA_HOME 变量。
要设置 JAVA_HOME,您必须找到特定的 Java 版本和文件夹。请关注此SO 讨论,以全面了解如何设置 java home 变量。由于我们将使用 java 8,因此我们的文件夹路径是/usr/lib/jvm/java-8-openjdk-amd64/
。只需转到/usr/lib/jvm
文件夹并查看可用的文件夹是什么。使用ls -l
查看文件夹及其软链接,因为这些文件夹可以是某些 java 版本的快捷方式。然后转到您的主目录cd ~
并编辑 bashrc 文件
cd ~
gedit .bashrc
然后将以下几行添加到文件,保存并退出。
## SETTING JAVA HOME
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin
之后,为了使您的操作生效,source ~/.bashrc
在终端中输入并运行
解决方案 5:
在 Windows(Windows 10)上,您可以通过安装 jdk-8u201-windows-x64.exe 并将系统环境变量重置为正确版本的 JAVA JDK 来解决此问题:
JAVA_HOME->C:\Program Files\Java\jdk1.8.0_201。
不要忘记重新启动终端,否则环境变量的重置将不会生效。
解决方案 6:
我只是想在这里发表一下我的看法,因为这将为使用PyCharm(尤其是运行配置)的人节省几个小时的时间。通过修改 JAVA_HOME 和 PATH 环境变量(就像这里大多数人推荐的那样)将您的.bashrc
或.bash_profile
指向 Java 8 后,您会注意到,当您使用 PyCharm 的运行配置运行 Spark 时,它仍然不会选择正确的 Java。看起来 PyCharm 存在一些问题(我在 Mac Catalina 中使用 PyCharm Professional 2020.2)。此外,当您使用 PyCharm 的终端运行它时,它运行良好。这证实了 PyCharm 出了问题。为了让 PyCharm 的运行配置选择新的 JAVA,我必须在运行配置中专门添加 JAVA_HOME 环境变量,如下所示-
并且成功了!
另一个可行的选择是检查运行配置窗口Include system environment variables option
中的(见上图)并重新启动 PyCharmEnvironment Variables
解决方案 7:
对于 Debian 10“buster”用户,该软件包中提供了 Java 8 JRE nvidia-openjdk-8-jre
。
使用安装
sudo apt install nvidia-openjdk-8-jre
JAVA_HOME
然后在运行时设置pyspark
,例如:
JAVA_HOME=/usr/lib/jvm/nvidia-java-8-openjdk-amd64/ pyspark
解决方案 8:
我在 Windows 中遇到了同样的问题,并且我已将 JAVA_HOME 添加到环境变量路径中:
JAVA_HOME:C:\Program Files\Java\jdk-11.0.1
解决方案 9:
你好,实际上,为了确保你设置了正确的 SPARK_HOME PATH,你可以使用这个 python 脚本来找到它:https://github.com/apache/spark/blob/master/python/pyspark/find_spark_home.py
python3 find_spark_home.py
/usr/local/lib/python3.7/site-packages/pyspark
在我的 Mac 上,在终端上:
vim ~/.bashrc
并添加路径:
export JAVA_HOME=/Library/java/JavaVirtualMachines/adoptopenjdk-8.jdk/contents/Home/
export SPARK_HOME=/usr/local/lib/python3.7/site-packages/pyspark
export PYSPARK_PYTHON=/usr/local/bin/python3
最后应用更改
source ~/.bashrc
解决方案 10:
出现此问题的原因是您在 JAVA_HOME 环境变量中设置的 Java 版本。
旧 JAVA 路径:/usr/lib/jvm/java-1.11.0-openjdk-amd64
解决方案:将 JAVA_HOME 设置为 /usr/lib/jvm/java-8-openjdk-amd64
它会起作用的!!!
请注意我的错误是:
文件“/home/tms/myInstallDir/spark-2.4.5-bin-hadoop2.7/python/pyspark/rdd.py”,第 816 行,在 collect sock_info = self.ctx._jvm.PythonRDD.collectAndServe(self._jrdd.rdd()) 文件“/home/tms/myInstallDir/spark-2.4.5-bin-hadoop2.7/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py”,第 1257 行,在call
文件“/home/tms/myInstallDir/spark-2.4.5-bin-hadoop2.7/python/pyspark/sql/utils.py”,第 79 行,在 deco 中引发 IllegalArgumentException(s.split(': ', 1)[1], stackTrace) pyspark.sql.utils.IllegalArgumentException:u'不支持的类文件主版本 55'
解决方案 11:
在 macOS 上:使用以下命令在笔记本电脑上安装 Java8:
brew tap AdoptOpenJDK/openjdk
brew cask install adoptopenjdk8
扫码咨询,免费领取项目管理大礼包!