Spark Error - Nicht unterstützte Hauptversion der Klassendatei

80

Ich versuche, Spark auf meinem Mac zu installieren. Ich habe Home Brew verwendet, um Spark 2.4.0 und Scala zu installieren. Ich habe PySpark in meiner Anaconda-Umgebung installiert und verwende PyCharm für die Entwicklung. Ich habe in mein Bash-Profil exportiert:

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

Ich kann es jedoch nicht zum Laufen bringen.

Ich vermute, dass dies auf die Java-Version beim Lesen des Tracebacks zurückzuführen ist. Ich würde mich sehr über Hilfe freuen, um das Problem zu beheben. Bitte kommentieren Sie, ob ich Informationen bereitstellen kann, die über den Traceback hinaus hilfreich sind.

Ich erhalte die folgende Fehlermeldung:

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
James
quelle
2
Dieses Update funktionierte für mich sogar mit "Nicht unterstützte Klassendatei Hauptversion 57"
SchwarzeHuhn
UPDATE: Um dieses Problem zu beheben, habe ich das bash_profile bearbeitet, um sicherzustellen, dass Java 1.8 als globaler Standard wie folgt verwendet wird: touch ~/.bash_profile; open ~/.bash_profile Hinzufügen export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)und Speichern innerhalb der Textbearbeitung.
James
Dieser Fix funktioniert für jedes Java auf Mac. Libexec hat nichts mit Lizenzierung oder Orakel zu tun
OneCricketeer

Antworten:

87

Edit Spark 3.0 unterstützt Java 11, daher müssen Sie ein Upgrade durchführen

Spark läuft unter Java 8/11, Scala 2.12, Python 2.7 + / 3.4 + und R 3.1+. Die Unterstützung von Java 8 vor Version 8u92 ist ab Spark 3.0.0 veraltet



Ursprüngliche Antwort

Bis Spark Java 11 oder höher unterstützt (was hoffentlich in der neuesten Dokumentation erwähnt wird, wenn dies der Fall ist), müssen Sie ein Flag hinzufügen, um Ihre Java-Version auf Java 8 zu setzen.

Ab Spark 2.4.x.

Spark läuft unter Java 8 , Python 2.7 + / 3.4 + und R 3.1+. Für die Scala-API verwendet Spark 2.4.4 Scala 2.12. Sie müssen eine kompatible Scala-Version (2.12.x) verwenden.

Unter Mac / Unix finden Sie unter asdf-java Informationen zur Installation verschiedener Javas

Auf einem Mac kann ich dies in meinem .bashrc,

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

Unter Windows können Sie Chocolately auschecken, aber verwenden Sie ernsthaft nur WSL2 oder Docker, um Spark auszuführen.


Sie können dies auch festlegen, spark-env.shanstatt die Variable für Ihr gesamtes Profil festzulegen.

Und das alles bedeutet natürlich, dass Sie Java 8 zusätzlich zu Ihrem vorhandenen Java 11 installieren müssen

OneCricketeer
quelle
4
Danke @ Cricket_007, wenn ich versuche, Brew Cask Java8 zu installieren. Ich erhalte die folgende Fehlermeldung. Cask 'Java8' ist nicht verfügbar: Es ist kein Cask mit diesem Namen vorhanden.
James
2
Ich habe Folgendes versucht, was zu funktionieren scheint: Brew Tap Caskroom / Versionen Brew Cask installieren Java8
James
1
Dies scheint das Problem behoben zu haben, jedoch nicht innerhalb von PyCharm. Muss ich auch darin auf Java verweisen? Vielen Dank!
James
1
Aktualisierte Anweisungen zur Installation von Java 8 JDK unter macOS: "Brauen tippen Sie auf AdoptOpenJDK / openjdk; Brühfass installieren adoptopenjdk8"
Joris
3
@ James, danke für die Antwort. Ich habe das Problem gelöst, indem ich einige Git-Anmeldeinformationen aktualisiert habe. Java8 ist sowieso nicht mehr verfügbar, da Oracle die Lizenz zuerst bei der Registrierung festgelegt hat. Dieser Ansatz funktioniert also nicht mehr. Um Java8 zu installieren, müssen Sie diese Antwort sehen. stackoverflow.com/questions/24342886/…
Gonzalo Garcia
88

Ich bin auf dieses Problem gestoßen, als ich Jupyter Notebook und Spark mit Java 11 ausgeführt habe. Ich habe Java 8 mithilfe der folgenden Schritte installiert und konfiguriert.

Installieren Sie Java 8:

$ sudo apt install openjdk-8-jdk

Da ich Java 11 bereits installiert hatte, setzte ich mein Standard-Java auf Version 8 mit:

$ sudo update-alternatives --config java

Wählen Sie Java 8 und bestätigen Sie Ihre Änderungen:

$ java -version

Die Ausgabe sollte ähnlich sein wie:

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)

Ich kann Spark jetzt erfolgreich in Jupyter Notebook ausführen. Die obigen Schritte basierten auf dem folgenden Handbuch: https://www.digitalocean.com/community/tutorials/how-to-install-java-with-apt-on-ubuntu-18-04

Andre Porto
quelle
1
Wenn Sie sdkman verwenden, sdk install java 8.0.212-zuluinstalliert Java 8 und fragt, ob Sie das installierte Java 8 als Standard-Java verwenden möchten
Xiao
Vielen Dank! Mein Fall war genau der gleiche wie dein.
Kenny Aires
19

Ich fand , dass die Zugabe von Funkenort durch findspark und java8 mit o am Anfang des Skripts der einfachste Lösung:

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) 
Ferran
quelle
7

Das Problem ist, dass PySpark für einige Funktionen Java 8 benötigt. Spark 2.2.1 hatte Probleme mit Java 9 und höher. Die empfohlene Lösung war die Installation von Java 8.

Sie können Java-8 speziell installieren, es als Standard-Java festlegen und es erneut versuchen.

um Java 8 zu installieren,

sudo apt install openjdk-8-jdk

Befolgen Sie diese Anweisungen, um die Standard-Java-Version zu ändern . Sie können den Befehl verwenden

 update-java-alternatives --list

zum Auflisten aller verfügbaren Java-Versionen.

Legen Sie einen Standard fest, indem Sie den folgenden Befehl ausführen:

sudo update-alternatives --config java

um die gewünschte Java-Version auszuwählen. Geben Sie die genaue Nummer in der bereitgestellten Liste an. Dann cheak deine Java-Version java -versionund es sollte aktualisiert werden. Legen Sie auch die Variable JAVA_HOME fest.

Um JAVA_HOME festzulegen, müssen Sie die spezifische Java-Version und den Ordner finden. Sehen Sie sich diese SO-Diskussion an, um eine vollständige Vorstellung vom Festlegen der Java-Home-Variablen zu erhalten. Da wir Java 8 verwenden werden, lautet unser Ordnerpfad /usr/lib/jvm/java-8-openjdk-amd64/. Gehen Sie einfach in den /usr/lib/jvmOrdner und knarren Sie, welche Ordner verfügbar sind. Verwenden Sie ls -ldiese Option, um Ordner und ihre Softlinks anzuzeigen, da diese Ordner für einige Java-Versionen eine Verknüpfung sein können. Gehen Sie dann in Ihr Home-Verzeichnis cd ~und bearbeiten Sie die bashrc-Datei

cd ~
gedit .bashrc

Fügen Sie dann der Datei folgende Zeilen hinzu, speichern Sie sie und beenden Sie sie.

## SETTING JAVA HOME
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin

Geben Sie danach das source ~/.bashrc Terminal ein und führen Sie es aus, um die Wirkung zu erzielen

Rajitha Fernando
quelle
4

Unter Windows (Windows 10) können Sie das Problem beheben, indem Sie jdk-8u201-windows-x64.exe installieren und die Systemumgebungsvariable auf die richtige Version des JAVA JDK zurücksetzen:

JAVA_HOME -> C: \ Programme \ Java \ jdk1.8.0_201.

Vergessen Sie nicht, das Terminal neu zu starten, da sonst das Zurücksetzen der Umgebungsvariablen nicht einsetzt.

tomasvanoyen
quelle
Bitte vergessen Sie nicht, das Terminal neu zu starten!
Rishi Jain
1

Für Debian 10 'Buster'-Benutzer ist Java 8 JRE im nvidia-openjdk-8-jrePaket verfügbar .

Installieren Sie es mit

sudo apt install nvidia-openjdk-8-jre

Dann JAVA_HOMEbeim Laufen einstellen pyspark, zB:

JAVA_HOME=/usr/lib/jvm/nvidia-java-8-openjdk-amd64/ pyspark
SergiyKolesnikov
quelle
Ich würde vorschlagen, AdoptOpenJDK über Nvidia zu verwenden, um Java
OneCricketeer
0

Ich habe das gleiche Problem in Windows und habe JAVA_HOME zum Pfad der Umgebungsvariablen hinzugefügt:

JAVA_HOME: C: \ Programme \ Java \ jdk-11.0.1

Chaymae Ahmed
quelle
1
Hallo, ich habe das gleiche getan. Trotzdem erhalte ich den gleichen Fehler. Gibt es noch etwas, das du geändert hast? C: \ Programme \ Java \ jdk-11.0.2
Gautam
@Gautum Wie die anderen Antworten zeigen, benötigen Sie Java 8. Der Fehler besagt ausdrücklich, dass Version 55 (Java 11) nicht unterstützt wird
OneCricketeer
0

Hallo, um sicherzugehen, dass Sie den richtigen SPARK_HOME-Pfad angeben, können Sie ihn mit diesem Python-Skript suchen: 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

Auf meinem Mac auf dem Terminal:

vim ~/.bashrc

und fügen Sie den Pfad hinzu:

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

und dann endlich die Änderung anzuwenden

source ~/.bashrc
ak6o
quelle
0

Unter macOS: Installieren Sie Java8 mit den folgenden Befehlen auf Ihrem Laptop:

brew tap AdoptOpenJDK/openjdk
brew cask install adoptopenjdk8
ijoseph
quelle
-1

Dieses Problem tritt aufgrund der Java-Version auf, die Sie für die Umgebungsvariable JAVA_HOME festgelegt haben.

ALTER JAVA-Pfad: /usr/lib/jvm/java-1.11.0-openjdk-amd64

Lösung: Setzen Sie JAVA_HOME auf / usr / lib / jvm / java-8-openjdk-amd64

Es wird klappen!!!

Beachten Sie, dass mein Fehler war:

Datei "/home/tms/myInstallDir/spark-2.4.5-bin-hadoop2.7/python/pyspark/rdd.py", Zeile 816, in collect sock_info = self.ctx._jvm.PythonRDD.collectAndServe (self._jrdd .rdd ()) Datei "/home/tms/myInstallDir/spark-2.4.5-bin-hadoop2.7/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", Zeile 1257, in Call - File "/home/tms/myInstallDir/spark-2.4.5-bin-hadoop2.7/python/pyspark/sql/utils.py", Linie 79, in Deco raise Illegal (s.split ( ':', 1) [1], stackTrace) pyspark.sql.utils.IllegalArgumentException: u'Unsupported class file major version 55 '

Tanaji Sutar
quelle
Was fügt dies zu der vorhandenen Antwort hinzu, die besagt, dass Java 8 erforderlich ist?
OneCricketeer