【问题标题】:Spark Error - Unsupported class file major versionSpark 错误 - 不支持的类文件主要版本
【发布时间】:2019-05-04 02:58:43
【问题描述】:

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

标签: java python macos apache-spark pyspark


【解决方案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,你需要看到这个答案。 stackoverflow.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
        

        【讨论】:

          猜你喜欢
          • 2023-03-03
          • 2015-03-20
          • 1970-01-01
          • 2022-11-08
          • 2019-07-27
          • 2020-04-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多