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

Posted

技术标签:

【中文标题】Spark 错误 - 不支持的类文件主要版本【英文标题】:Spark Error - Unsupported class file major version 【发布时间】:2018-12-02 18:16:37 【问题描述】:

我正在尝试在我的 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

【问题讨论】:

即使使用“不支持的类文件主要版本 57”,此修复对我也有效 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 无关 Spark 的依赖地狱。我讨厌它。 @James 嗨,我遵循了您的解决方案,但是当我在 Pychanr 终端中输入java -version 时,它仍然给我openjdk version "11.0.6" 2020-01-14 OpenJDK Runtime Environment (build 11.0.6+8-b765.1) 【参考方案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 起,Java 8 对 8u92 版本的支持已被弃用



原答案

在 Spark 支持 Java 11 或更高版本之前(希望在the latest documentation 中提及),您必须添加一个标志以将您的 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 8除了现有的 Java 11

【讨论】:

感谢@cricket_007 当我尝试 brew cask install java8 我收到以下错误 Cask 'java8' is available: No Cask with this name exists. 我尝试了以下似乎可行的方法:brew tap caskroom/versions brew cask install java8 这似乎已经解决了这个问题,但在 PyCharm 中没有。我还需要在其中指向 java 吗?谢谢! 更新了在 macOS 上安装 Java 8 JDK 的说明:“brew tap AdoptOpenJDK/openjdk; brew cask install admissionopenjdk8” @James 感谢您的回复,我通过更新一些 git 凭据解决了问题。无论如何,java8 不再可用,因为 Oracle 首先在注册时设置了许可证。所以这种方法不再有效。为了安装 java8 你需要看到这个答案。 ***.com/questions/24342886/…【参考方案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

【讨论】:

如果你使用的是sdkman,sdk install java 8.0.212-zulu会安装java 8并询问你是否要使用安装的java 8作为默认java 谢谢!我的情况和你的完全一样。 您好,我发现自己使用的是 java 11,所以我想我必须安装 java 8,但我使用的是 windows + Pycharm,有没有可以遵循的说明?非常感谢。 @Cecilia 我自己运行 Windows,但对于 Spark,我只在虚拟机或 AWS 上运行它。这是我的首选方法,尤其是由于 Java 要求。我发现它使设置从长远来看比在本地机器上运行更简单。 嗨 @AndreOporto 我已经放弃了 windows 的设置,我开始尝试在 AWS 中运行 pyspark,只是想知道你使用的是 Glue 还是其他东西?有什么推荐的指导文章吗?非常感谢。【参考方案3】:

我发现通过 findsparkjava8 添加 spark 位置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) 

【讨论】:

【参考方案4】:

听到的问题是 PySpark 的某些功能需要 Java 8。 Spark 2.2.1 在 Java 9 及更高版本上存在问题。推荐的解决方案是安装 Java 8。

您可以专门安装 java-8,并将其设置为默认 java,然后重试。

安装java 8,

sudo apt install openjdk-8-jdk

要更改默认的 java 版本,请关注 this。你可以使用命令

 update-java-alternatives --list

用于列出所有可用的 java 版本。

通过运行命令设置默认值:

sudo update-alternatives --config java

选择你想要的java版本。在提供的列表中提供准确的数字。 然后检查你的java版本java -version,它应该被更新。同时设置 JAVA_HOME 变量。

要设置JAVA_HOME,你必须找到具体的Java版本和文件夹。 Fallow this 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。

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

【讨论】:

请不要忘记重启终端! 您好,我在系统环境变量中添加了 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)【参考方案6】:

对于 Debian 10 'buster' 用户,nvidia-openjdk-8-jre 包中提供了 Java 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【参考方案7】:

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

它成功了!

另一个同样有效的选项是检查运行配置中Environment Variables 窗口中的Include system environment variables option(参见上面的屏幕截图)并重新启动 PyCharm

【讨论】:

好收获。我不小心截错了截图。现在已经修复了【参考方案8】:

我在windows中也遇到了同样的问题,我在环境变量路径中添加了JAVA_HOME:

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

【讨论】:

嗨,我也做过。我仍然遇到同样的错误。你还有什么改变吗? C:\Program Files\Java\jdk-11.0.2 @Gautum 正如其他答案所示,您需要 Java 8。错误明确表示不支持版本 55(即 Java 11)【参考方案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 行,收集 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 引发 IllegalArgumentException(s.split(': ', 1)[1], stackTrace) pyspark.sql.utils.IllegalArgumentException: u'Unsupported class file major version 55'

【讨论】:

这对现有的要求 Java 8 的答案增加了什么?【参考方案11】:

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

brew tap AdoptOpenJDK/openjdk
brew cask install adoptopenjdk8

【讨论】:

以上是关于Spark 错误 - 不支持的类文件主要版本的主要内容,如果未能解决你的问题,请参考以下文章

NativeScript Android 构建失败并出现异常 - 不支持的类文件主要版本 57

如何在 IntelliJ IDEA 中修复“不支持的类文件主要版本 60”?

适用于VS 2017的Cordova工具 - 不支持的类文件版本52

漏洞!源单元“_BuildScript_”中的“语义分析”阶段异常 Apple Arm 上不支持的类文件主要版本 61

Visual Studio 2015:xamarin 中的“不支持的类版本错误”

Spark 支持使用 Windows 功能