Spark 错误 - 不支持的类文件主要版本

IT小君   2021-09-29T04:03:08

我正在尝试在我的 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
评论(11)
IT小君

Edit 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

2021-09-29T04:03:08   回复
IT小君

我在使用 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

2021-09-29T04:03:08   回复
IT小君

我发现在脚本的开头通过findsparkjava8使用os添加火花位置是最简单的解决方案:

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) 
2021-09-29T04:03:09   回复
IT小君

问题是 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 在终端中键入并运行

2021-09-29T04:03:09   回复
IT小君

在 Windows (Windows 10) 上,您可以通过安装 jdk-8u201-windows-x64.exe 并将系统环境变量重置为 JAVA JDK 的正确版本来解决该问题:

JAVA_HOME -> C:\Program Files\Java\jdk1.8.0_201。

不要忘记重新启动终端,否则环境变量的重置不会启动。

2021-09-29T04:03:09   回复
IT小君

对于 Debian 10 'buster' 用户,nvidia-openjdk-8-jre包中提供了 Java 8 JRE

安装它

sudo apt install nvidia-openjdk-8-jre

然后JAVA_HOME在运行时设置pyspark,例如:

JAVA_HOME=/usr/lib/jvm/nvidia-java-8-openjdk-amd64/ pyspark
2021-09-29T04:03:10   回复
IT小君

只是想在这里添加我的两分钱,因为它可以为使用PyCharm 的人(尤其是运行配置)节省几个小时的时间通过修改 JAVA_HOME 和 PATH 环境变量(就像这里的大多数人推荐的那样)将您的.bashrcor更改.bash_profile为指向 Java 8 后,您会注意到,当您使用 PyCharm 的运行配置运行 Spark 时,它仍然不会选择正确的爪哇。看起来 PyCharm 存在一些问题(我在 Mac Catalina 中使用 PyCharm Professional 2020.2)。此外,当您使用 PyCharm 的终端运行它时,它工作正常。这证实了 PyCharm 有问题。为了让 PyC​​harm 的运行配置能够获取新的 JAVA,我不得不在运行配置中专门添加 JAVA_HOME 环境变量,如下所示- 在此处输入图片说明

它奏效了!

另一个也有效的选项是在运行配置Include system environment variables optionEnvironment Variables窗口中检查(见上面的截图)并重新启动 PyCharm

2021-09-29T04:03:10   回复
IT小君

我在windows中也有同样的问题,我已经将JAVA_HOME添加到环境变量路径中:

JAVA_HOME: C:\Program Files\Java\jdk-11.0.1

2021-09-29T04:03:10   回复
IT小君

嗨,实际上要确保您放置了正确的 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
2021-09-29T04:03:10   回复
IT小君

出现此问题是由于您在 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 行,在调用 文件“/home/tms/myInstallDir/spark-2.4.5-bin-hadoop2.7/python/pyspark/sql/utils.py”,第 79 行,在装饰中引发 IllegalArgumentException(s.split(': ', 1)[1], stackTrace) pyspark.sql.utils.IllegalArgumentException: u'不支持的类文件主要版本 55'

2021-09-29T04:03:11   回复
IT小君

在 macOS 上:使用以下命令在您的笔记本电脑上安装 Java8:

brew tap AdoptOpenJDK/openjdk
brew cask install adoptopenjdk8
2021-09-29T04:03:11   回复