Błąd Spark - nieobsługiwana wersja główna pliku klasy


83

Próbuję zainstalować Sparka na moim Macu. Użyłem domowego naparu do zainstalowania Spark 2.4.0 i Scali. Zainstalowałem PySpark w moim środowisku anaconda i używam PyCharm do programowania. Wyeksportowałem do mojego profilu 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

Jednak nie mogę zmusić go do pracy.

Podejrzewam, że jest to spowodowane wersją java z odczytu śledzenia. Naprawdę byłbym wdzięczny za pomoc w rozwiązaniu problemu. Proszę o komentarz, jeśli są jakieś informacje, które mogę podać, które są pomocne poza śledzeniem wstecznym.

Otrzymuję następujący błąd:

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
ta poprawka działała dla mnie nawet z "Nieobsługiwaną wersją główną pliku klasy 57"
SchwarzeHuhn,

NAPRAW: Aby rozwiązać ten problem, wyedytowałem bash_profile, aby upewnić się, że java 1.8 jest używana jako globalne ustawienie domyślne w następujący sposób: touch ~/.bash_profile; open ~/.bash_profile Dodawanie export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)i zapisywanie w edycji tekstu.
James

Ta poprawka działa dla każdej Javy na Macu. Libexec nie ma nic wspólnego z licencjonowaniem ani wyrocznią
OneCricketeer,

Piekło zależności dla Sparka. Nienawidzę tego.
0x4a6f4672

Odpowiedzi:


91

Edycja Spark 3.0 obsługuje Javę 11, więc musisz uaktualnić

Spark działa na Javie 8/11, Scali 2.12, Pythonie 2.7 + / 3.4 + i R 3.1+. Obsługa języka Java 8 wcześniejszych niż wersja 8u92 jest przestarzała od wersji Spark 3.0.0



Oryginalna odpowiedź

Dopóki Spark nie będzie obsługiwał języka Java 11 lub nowszego (o czym miejmy nadzieję, że zostanie wspomniane w najnowszej dokumentacji, gdy jest), musisz dodać flagę, aby ustawić wersję Java na Java 8.

Od Spark 2.4.x

Spark działa na Javie 8 , Pythonie 2.7 + / 3.4 + i R 3.1+. W przypadku interfejsu API Scala Spark 2.4.4 używa Scala 2.12. Będziesz musiał użyć kompatybilnej wersji Scala (2.12.x)

Na Mac / Unix, zobacz asdf-java, aby zainstalować różne Javas

Na komputerze Mac mogę to zrobić w moim .bashrc,

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

W systemie Windows kup Chocolately, ale poważnie, po prostu użyj WSL2 lub Dockera, aby uruchomić Spark.


Możesz również ustawić tę spark-env.shopcję zamiast ustawiać zmienną dla całego profilu.

I oczywiście to wszystko oznacza, że oprócz istniejącej Javy 11 musisz zainstalować Javę 8


4
Dzięki @ cricket_007, kiedy próbuję zaparzyć beczkę instalacji java8. Otrzymuję następujący błąd Beczka „java8” jest niedostępna: Nie istnieje beczka o tej nazwie.
James

2
Wypróbowałem następujące rozwiązanie, które wydaje się działać: brew tap caskroom / wersje brew cask install java8
James

1
Wydaje się, że rozwiązało to problem, ale nie w PyCharm. Czy muszę również wskazywać na java w tym? Dzięki!
James

1
Zaktualizowane instrukcje dotyczące instalacji oprogramowania Java 8 JDK w systemie macOS: „brew tap AdoptOpenJDK / openjdk; brew cask install adoptopenjdk8”
Joris

3
@James dzięki za odpowiedź, rozwiązałem go, aktualizując niektóre poświadczenia git. w każdym razie java8 nie jest już dostępny, ponieważ Oracle najpierw ustawił licencję przy rejestracji. Więc to podejście już nie działa. Aby zainstalować java8, musisz zobaczyć tę odpowiedź. stackoverflow.com/questions/24342886/…
Gonzalo Garcia

89

Napotkałem ten problem podczas uruchamiania Jupyter Notebook i Spark przy użyciu Java 11. Zainstalowałem i skonfigurowałem dla Java 8, wykonując następujące kroki.

Zainstaluj Javę 8:

$ sudo apt install openjdk-8-jdk

Ponieważ już zainstalowałem Javę 11, ustawiłem domyślną Javę na wersję 8 za pomocą:

$ sudo update-alternatives --config java

Wybierz Java 8, a następnie potwierdź zmiany:

$ java -version

Wynik powinien być podobny do:

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)

Teraz mogę pomyślnie uruchomić Spark w Jupyter Notebook. Powyższe kroki zostały oparte na następującym przewodniku: https://www.digitalocean.com/community/tutorials/how-to-install-java-with-apt-on-ubuntu-18-04


1
jeśli używasz sdkman, sdk install java 8.0.212-zuluinstaluje java 8 i pyta, czy chcesz używać zainstalowanej javy 8 jako domyślnej java
Xiao

Dziękuję Ci! mój przypadek był dokładnie taki sam jak twój.
Kenny Aires,

19

Okazało się, że dodanie lokalizacji zapłonowej poprzez findspark i java8 z OS na początku skryptu najprostszym rozwiązaniem:

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

Problem jest taki, że PySpark wymaga Java 8 dla niektórych funkcji. Spark 2.2.1 miał problemy z Javą 9 i nowszymi wersjami. Zalecanym rozwiązaniem była instalacja Java 8.

możesz specjalnie zainstalować java-8 i ustawić ją jako domyślną java i spróbować ponownie.

zainstalować java 8,

sudo apt install openjdk-8-jdk

aby zmienić domyślną wersję java, postępuj zgodnie z tym . możesz użyć polecenia

 update-java-alternatives --list

za wyświetlenie wszystkich dostępnych wersji Java.

ustaw domyślny, uruchamiając polecenie:

sudo update-alternatives --config java

aby wybrać żądaną wersję java. podaj dokładną liczbę na podanej liście. następnie sprawdź swoją wersję java java -versioni powinna zostać zaktualizowana. Ustaw również zmienną JAVA_HOME.

aby ustawić JAVA_HOME, musisz znaleźć określoną wersję Java i folder. Wykonaj dyskusję SO, aby uzyskać pełny pomysł na ustawienie zmiennej domowej Java. ponieważ będziemy używać java 8, nasza ścieżka do folderu to /usr/lib/jvm/java-8-openjdk-amd64/. po prostu przejdź do /usr/lib/jvmfolderu i skrzyp, jakie są dostępne foldery. użyj, ls -laby wyświetlić foldery i ich miękkie łącza, ponieważ te foldery mogą być skrótami dla niektórych wersji Java. następnie przejdź do katalogu domowego cd ~i edytuj plik bashrc

cd ~
gedit .bashrc

następnie Dodaj poniższe linie do pliku, zapisz i zakończ.

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

następnie, aby uzyskać efekt tego, co zrobiłeś, wpisz source ~/.bashrc i uruchom w terminalu


4

W systemie Windows (Windows 10) problem można rozwiązać, instalując jdk-8u201-windows-x64.exe i resetując systemową zmienną środowiskową do poprawnej wersji JAVA JDK:

JAVA_HOME -> C: \ Program Files \ Java \ jdk1.8.0_201.

Nie zapomnij zrestartować terminala, w przeciwnym razie resetowanie zmiennej środowiskowej nie rozpocznie się.


nie zapomnij zrestartować terminala!
rishi jain

2

Dla użytkowników Debiana 10 „buster” w nvidia-openjdk-8-jrepakiecie dostępna jest Java 8 JRE .

Zainstaluj go z

sudo apt install nvidia-openjdk-8-jre

Następnie ustaw JAVA_HOMEpodczas biegu pysparknp:

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

Sugerowałbym użycie AdoptOpenJDK na Nvidii, aby uzyskać Javę
OneCricketeer

1

Chciałem tylko dodać tutaj moje dwa centy, ponieważ pozwoli to zaoszczędzić kilka godzin czasu dla osób, które używają PyCharm (szczególnie konfiguracja uruchamiania). Po zmianie .bashrclub, .bash_profileaby wskazać na Javę 8, modyfikując zmienne JAVA_HOME i PATH env (jak zalecała większość osób tutaj), zauważysz, że gdy uruchomisz Spark'a przy użyciu konfiguracji uruchamiania PyCharm, nadal nie wybierze właściwego Jawa. Wygląda na to, że wystąpił problem z PyCharm (używam PyCharm Professional 2020.2 na Mac Catalina). Dodatkowo, gdy uruchomisz go za pomocą terminala PyCharm, działa dobrze. To potwierdza, że ​​coś jest nie tak z PyCharm. Aby konfiguracja uruchamiania PyCharm podniosła nową JAVA, musiałem specjalnie dodać zmienną środowiskową JAVA_HOME w konfiguracji uruchamiania, jak pokazano poniżej: wprowadź opis obrazu tutaj

i zadziałało!

Inną opcją, która również działa, jest sprawdzenie Include system environment variables optionw Environment Variablesoknie w konfiguracji uruchamiania (patrz zrzut ekranu powyżej) i ponowne uruchomienie PyCharm


Dobry chwyt. Przypadkowo zrobiłem zły zrzut ekranu. To już naprawione
Heapify

0

Mam ten sam problem w oknach i dodałem JAVA_HOME do ścieżki zmiennej środowiskowej:

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


1
Cześć, zrobiłem to samo. Nadal otrzymuję ten sam błąd. Czy zmieniłeś coś jeszcze? C: \ Program Files \ Java \ jdk-11.0.2
Gautam

@Gautum Jak pokazują inne odpowiedzi, potrzebujesz Javy 8. Błąd wyraźnie mówi, że wersja 55 (czyli Java 11) nie jest obsługiwana
OneCricketeer

0

Cześć, aby mieć pewność, że wpisujesz właściwą SPARK_HOME ŚCIEŻKĘ, możesz użyć tego skryptu Pythona, aby ją zlokalizować: 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

Na moim Macu na terminalu:

vim ~/.bashrc

i dodaj ścieżkę:

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

a na koniec zastosować zmianę

source ~/.bashrc

0

W systemie macOS: zainstaluj Java8 na swoim laptopie za pomocą następujących poleceń:

brew tap AdoptOpenJDK/openjdk
brew cask install adoptopenjdk8

-1

Ten problem występuje z powodu wersji Java ustawionej w zmiennej środowiskowej JAVA_HOME.

STARA ścieżka JAVA: /usr/lib/jvm/java-1.11.0-openjdk-amd64

Rozwiązanie: ustaw JAVA_HOME na / usr / lib / jvm / java-8-openjdk-amd64

To będzie działać!!!

Zauważ, że mój błąd to:

Plik "/home/tms/myInstallDir/spark-2.4.5-bin-hadoop2.7/python/pyspark/rdd.py", wiersz 816, w collect sock_info = self.ctx._jvm.PythonRDD.collectAndServe (self._jrdd .rdd ()) Plik "/home/tms/myInstallDir/spark-2.4.5-bin-hadoop2.7/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", wiersz 1257, w wywołaniu Plik "/home/tms/myInstallDir/spark-2.4.5-bin-hadoop2.7/python/pyspark/sql/utils.py", wiersz 79, w deco podnieś IllegalArgumentException (s.split (':', 1) [1], stackTrace) pyspark.sql.utils.IllegalArgumentException: u'Unsupported class file major version 55 '


Co to dodaje do istniejącej odpowiedzi, która mówi, że wymagana jest Java 8?
OneCricketeer
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.