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


82

我正在尝试在Mac上安装Spark。我使用自制软件安装了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
此修复工作对我来说,即使“不支持的类文件的主要版本57”
SchwarzeHuhn

FIX: 要解决此问题,我编辑了bash_profile以确保将Java 1.8用作全局默认值,如下所示: 在文本编辑中touch ~/.bash_profile; open ~/.bash_profile 添加 export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)和保存。
詹姆斯

该修复程序适用于Mac上的任何Java。Libexec与许可或oracle没有关系
OneCricketeer

Spark的依赖地狱。我讨厌它。
0x4a6f4672

Answers:


90

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开始不推荐使用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以安装不同的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


4
感谢@ cricket_007,当我尝试将酒桶安装java8时,出现以下错误木桶'java8'不可用:不存在具有该名称的木桶。
詹姆斯

2
我尝试了以下似乎可行的方法:brew tap酒馆/版本brew cask install java8
James

1
这似乎已经解决了问题,但在PyCharm中却没有。我还需要在其中指向Java吗?谢谢!
詹姆斯

1
更新了在macOS上安装Java 8 JDK的说明:“轻按AdoptOpenJDK / openjdk;酿造木桶安装采用openjdk8”
Joris

3
@James感谢您的答复,我通过更新一些git凭据解决了。无论如何,java8不再可用,因为Oracle首先在注册时设置了许可证。因此,该方法不再起作用。为了安装java8,您需要查看此答案。stackoverflow.com/questions/24342886/...
贡萨洛·加西亚

89

使用Java 11运行Jupyter Notebook和Spark时遇到了这个问题。我使用以下步骤为Java 8安装并配置了Java。

安装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

谢谢!我的案子和你的案子完全一样。
肯尼·艾尔斯

19

我发现在脚本的开头通过os通过findsparkjava8添加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版本和文件夹。放慢讨论,以获取设置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。

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


请不要忘记重启终端!
里希·in那(Rishi Jain)

2

对于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

我建议在Nvidia上使用AdoptOpenJDK来获取Java
OneCricketeer 19/12/18

1

只是想在这里加两分钱,因为它可以为使用PyCharm(特别是运行配置)的人们节省几个小时的时间。通过修改JAVA_HOME和PATH env变量更改.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 optionEnvironment Variables中运行配置窗口(参见上面的截图),并重新启动PyCharm


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如其他答案所示,您需要Java8。错误明确指出不支持版本55(即Java 11)
OneCricketeer

0

您好,实际上,请确保您输入了正确的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

0

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

brew tap AdoptOpenJDK/openjdk
brew cask install adoptopenjdk8

-1

由于您在JAVA_HOME环境变量上设置的Java版本而发生此问题。

旧的JAVA路径:/usr/lib/jvm/java-1.11.0-openjdk-amd64

解决方案:将JAVA_HOME设置为/ usr / lib / jvm / java-8-openjdk-amd64

它将工作!!!

注意我的错误是:

在收集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'


这对要求Java 8的现有答案有什么补充?
OneCricketeer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.