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

107

我正在尝试在我的 Mac 上安装 Spark。我已经使用 Homebrew 安装了 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

2
这个修复方法对我有效,即使出现了“Unsupported class file major version 57”的错误。 - SchwarzeHuhn
2
修复:为了解决这个问题,我编辑了bash_profile文件,确保使用Java 1.8作为全局默认版本,具体操作如下:touch ~/.bash_profile; open ~/.bash_profile在文本编辑器中添加以下内容:export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)并保存。 - shbfy
这个修复程序适用于Mac上的任何Java。Libexec与许可证或Oracle无关。 - OneCricketeer
Spark的依赖关系问题真是让人头疼,我非常讨厌它。 - 0x4a6f4672
@James 你好,我按照你的解决方案操作了,但是当我在Pycharm终端输入java -version时,仍然显示openjdk version "11.0.6" 2020-01-14 OpenJDK Runtime Environment (build 11.0.6+8-b765.1) - wawawa
11个回答

112

编辑 Spark 3.0 支持 Java 11,因此您需要升级。

Spark 运行在 Java 8/11、Scala 2.12、Python 2.7+/3.4+ 和 R 3.1+ 上。自 Spark 3.0.0 起,Java 8 版本低于 8u92 的支持已被弃用。



原始回答

在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以安装不同的Javas

在Mac上,我能够在我的.bashrc中执行此操作。

export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)

在Windows上,可以使用Chocolately,但是最好使用WSL2或Docker来运行Spark。
你可以在spark-env.sh中设置它,而不是为整个配置文件设置变量。
当然,这意味着你需要安装Java 8,除了你已经安装的Java 11。

4
感谢@cricket_007。当我尝试运行brew cask install java8时,出现了以下错误:Cask 'java8' 不可用:没有这个名称的 Cask 存在。 - shbfy
2
我尝试了以下命令,似乎可以正常工作:brew tap caskroom/versions brew cask install java8 - shbfy
2
这似乎已经解决了问题,但不是在PyCharm中。我还需要在其中指向Java吗?谢谢! - shbfy
1
当我执行brew tap caskroom/versions brew cask install java8时,出现了fatal: repository 'brew' does not exist错误提示。 - Gonzalo Garcia
3
@James,谢谢你回复,我通过更新一些 git 凭据解决了问题。不过由于 Oracle 对注册第一次访问设置了许可证,因此Java8不再可用。 因此那种方法不再起作用。如果要安装Java8,您需要查看这个答案:https://dev59.com/WWAf5IYBdhLWcg3wukpk#55774255 - Gonzalo Garcia
显示剩余12条评论

98

在运行 Jupyter Notebook 和 Spark 使用 Java 11 时,我遇到了这个问题。我按照以下步骤安装和配置了 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


1
如果您正在使用sdkman,sdk install java 8.0.212-zulu将安装Java 8,并询问您是否要将已安装的Java 8设置为默认Java。 - XoXo
谢谢!我的情况和你的完全一样。 - Kenny Aires
嗨,我发现自己正在使用Java 11,所以我想我必须安装Java 8,但我正在使用Windows + Pycharm,有没有我可以遵循的说明?非常感谢。 - wawawa
1
@Cecilia 我自己使用的是Windows,但对于Spark,我只在虚拟机或AWS上运行过。这是我的首选方法,特别是由于Java的要求。我发现与在本地计算机上运行相比,它可以使设置和拆卸更简单,从长远来看更加方便。 - Andre Oporto
嗨@AndreOporto,我已经放弃了在Windows上的设置,我开始尝试在AWS上运行pyspark,只是想知道你是否在使用Glue或其他什么?有任何建议的指导文章吗?非常感谢。 - wawawa

22

我发现在脚本开头通过 findsparkjava8 以及 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) 

7

问题在于,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并运行。


4
在Windows(Windows 10)上,您可以通过安装 jdk-8u201-windows-x64.exe 并将系统环境变量重置为正确的JAVA JDK版本来解决此问题:
JAVA_HOME -> C:\Program Files\Java\jdk1.8.0_201。
别忘了重新启动终端,否则环境变量的重置不会生效。

请不要忘记重新启动终端! - rishi jain
嗨,我已将 C:\ Program Files \ Java \ jdk1.8.0_221 添加到我的系统环境变量中,但是当我在 Pycharm 中检查“java -version”时,它仍然显示“openjdk version "11.0.6" 2020-01-14 OpenJDK Runtime Environment (build 11.0.6+8-b765.1)”。 - wawawa

3

我想在这里补充一下,对于那些使用PyCharm(特别是运行配置)的人来说,这将为他们节省几个小时的时间。在修改JAVA_HOME和PATH环境变量以指向Java 8后(像大多数人建议的那样),您会注意到当您使用PyCharm的运行配置运行Spark时,它仍然无法选择正确的Java。看起来PyCharm存在某些问题(我在Mac Catalina中使用的是PyCharm Professional 2020.2)。此外,当您在PyCharm的终端上运行它时,它可以正常工作。这证实了PyCharm出现了问题。为使PyCharm的运行配置能够获取新的JAVA,我必须在运行配置中明确添加JAVA_HOME环境变量,如下所示 - enter image description here

这样就行了!

另一个同样有效的选项是在运行配置的“环境变量”窗口中勾选“包括系统环境变量选项”(请参见上面的屏幕截图),并重新启动PyCharm。


好的,发现了。我不小心截错了屏幕截图。现在已经修复了。 - Heapify

2

对于Debian 10 'buster'用户,Java 8 JRE可在nvidia-openjdk-8-jre软件包中获取。

安装命令如下:

sudo apt install nvidia-openjdk-8-jre

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

JAVA_HOME=/usr/lib/jvm/nvidia-java-8-openjdk-amd64/ pyspark

我建议使用AdoptOpenJDK而不是Nvidia来获取Java。 - OneCricketeer

0

这个问题是由于您在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行,在deco中 raise IllegalArgumentException(s.split(': ', 1)[1], stackTrace) pyspark.sql.utils.IllegalArgumentException: u'Unsupported class file major version 55'


这句话对于已经说过需要Java 8的答案有什么补充呢? - OneCricketeer

0

我在Windows上遇到了同样的问题,我已经将JAVA_HOME添加到环境变量路径中:

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


1
嗨,我已经做了同样的事情。但我仍然得到相同的错误。你还改了其他什么吗?C:\Program Files\Java\jdk-11.0.2 - Gautam
@Gautum 如其他答案所示,您需要Java 8。错误明确表示不支持版本55(即Java 11)。 - OneCricketeer

0
在 macOS 上:使用以下命令在您的笔记本电脑上安装 Java8:
brew tap AdoptOpenJDK/openjdk
brew cask install adoptopenjdk8

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