Spark Error - Непідтримувана основна версія файлу класу


82

Я намагаюся встановити Spark на своєму Mac. Я використовував саморобку для встановлення іскри 2.4.0 та Scala. Я встановив PySpark у своєму середовищі anaconda і використовую 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,

ВИПРАВЛЕННЯ: Щоб вирішити цю проблему, я відредагував файл bash_profile, щоб переконатися, що java 1.8 використовується як загальне за замовчуванням, як показано нижче: touch ~/.bash_profile; open ~/.bash_profile Додавання export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)та збереження в текстовому редагуванні.
Джеймс,

Це виправлення працює для будь-якої Java на Mac. Libexec не має нічого спільного з ліцензуванням або оракулом
OneCricketeer

Пекло залежності для Spark. Я це ненавиджу.
0x4a6f4672

Відповіді:


91

Edit Spark 3.0 підтримує Java 11, тому вам доведеться оновити

Spark працює на Java 8/11, Scala 2.12, Python 2.7 + / 3.4 + і R 3.1+. Підтримка Java 8 до версії 8u92 застаріла станом на Spark 3.0.0



Оригінальна відповідь

Поки Spark не підтримує Java 11 або новішої версії (про яку, сподіваємось, буде згадано в останній документації, коли вона є), вам потрібно додати прапор, щоб встановити для вашої версії Java Java 8.

Станом на Spark 2.4.x

Spark працює на Java 8 , Python 2.7 + / 3.4 + та R 3.1+. Для API Scala Spark 2.4.4 використовує Scala 2.12. Вам потрібно буде використовувати сумісну версію Scala (2.12.x)

На Mac / Unix див. Asdf-java для встановлення різних Javas

На Mac я можу робити це у своєму .bashrc,

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

У Windows замовте Chocolately, але серйозно просто використовуйте WSL2 або Docker для запуску Spark.


Ви також можете встановити це значення spark-env.shзамість змінної для всього свого профілю.

І, звичайно, це все означає, що вам потрібно буде встановити Java 8 на додаток до вашої існуючої Java 11


4
Дякую @ cricket_007, коли я намагаюся заварювати бочку встановити java8, я отримую таку помилку. Cask 'java8' недоступний: Бочка з таким ім'ям не існує.
Джеймс,

2
Я спробував наступне, що, здається, працює: заварювання касети / версії заварювання бочка встановити java8
Джеймс

1
Здається, це вирішило проблему, але не в PyCharm. Чи потрібно мені також вказувати на java? Дякую!
Джеймс,

1
Оновлені вказівки щодо встановлення Java 8 JDK на macOS: "заварювальний кран AdoptOpenJDK / openjdk; заварювання контейнера для встановлення Adotopenjdk8"
Джоріс,

3
@James, дякую за відповідь, я вирішив оновленням деяких облікових даних git. так чи інакше java8 більше не доступний, оскільки Oracle спочатку встановив ліцензію на реєстрацію. Тож такий підхід вже не працює. Для того, щоб встановити java8, вам потрібно побачити цю відповідь. stackoverflow.com/questions/24342886/…
Гонсало Гарсія

89

Я зіткнувся з цією проблемою під час запуску Jupyter Notebook and Spark за допомогою Java 11. Я встановив та налаштував 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)

Тепер я можу успішно запустити Spark у Jupyter Notebook. Наведені вище кроки базувались на наступному посібнику: 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

Я виявив, що додати розташування іскри через findspark та java8 за допомогою 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) 

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. Продовжуючи це обговорення SO, ви отримаєте повне уявлення про встановлення змінної home 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.

Не забудьте перезапустити термінал, інакше скидання змінної середовища не стартує.


будь ласка, не забудьте перезапустити термінал!
Ріші Джайн,

2

Для користувачів Debian 10 `` завада '' в 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

Я б запропонував використовувати AdoptOpenJDK через Nvidia для отримання Java
OneCricketeer

1

Просто хотів додати сюди свої два центи, оскільки це заощадить кілька годин часу для людей, які використовують PyCharm (особливо конфігурацію запуску). Змінивши .bashrcабо .bash_profileвкажіть на Java 8, змінивши змінні env JAVA_HOME і PATH (як це рекомендують більшість людей), ви помітите, що коли ви запускаєте Spark за допомогою конфігурації запуску PyCharm, він все одно не підбере правильну Java. Схоже, є якась проблема з PyCharm (я використовую PyCharm Professional 2020.2 у Mac Catalina). Крім того, коли ви запускаєте його за допомогою терміналу PyCharm, він працює нормально. Це підтверджує, що з PyCharm щось не так. Для того, щоб конфігурація запуску PyCharm підняла нову JAVA, мені довелося спеціально додати змінну середовища JAVA_HOME в конфігурацію запуску, як показано нижче -

введіть тут опис зображення

і це спрацювало!

Інший варіант, який також працює, це перевірка Include system environment variables optionу Environment Variablesвікні в конфігурації запуску (див. Знімок екрана вище) та перезапуск PyCharm


Я не думаю, що значення, що починається з, JAVA_HOME=є правильним
OneCricketeer

0

У мене така сама проблема у Windows, і я додав JAVA_HOME до шляху змінної середовища:

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


1
Привіт, я зробив те саме. Проте я отримую ту саму помилку. Ви ще щось змінили? C: \ Program Files \ Java \ jdk-11.0.2
Гаутам,

@Gautum Як видно з інших відповідей, вам потрібна Java 8. Помилка прямо говорить, що версія 55 (яка є Java 11) не підтримується
OneCricketeer

0

Привіт насправді, щоб бути впевненим, що ви ставите правильний шлях SPARK_HOME, ви можете використовувати цей скрипт 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, яку ви встановили для змінної середовища JAVA_HOME.

Шлях СТАРОЇ ЯВИ: /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, в деко підняти IllegalArgumentException (s.split (':', 1) [1], stackTrace) pyspark.sql.utils.IllegalArgumentException: u'Непідтримуваний файл класу, основна версія 55 '


Що це додає до існуючої відповіді, яка говорить про необхідність Java 8?
OneCricketeer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.