Ошибка Spark - неподдерживаемая основная версия файла класса

82

Я пытаюсь установить Spark на свой Mac. Я использовал самогон для установки Spark 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 не имеет ничего общего с лицензированием или Oracle
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+. Для Scala API Spark 2.4.4 использует Scala 2.12. Вам нужно будет использовать совместимую версию Scala (2.12.x)

На Mac / Unix см. Asdf-java для установки различных Jav.

На 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' is unavailable: Cask с таким именем не существует.
Джеймс
2
Я пробовал следующее, которое, кажется, работает: заваривать бочку / версии варить бочку установить java8
Джеймс
1
Похоже, что проблема устранилась, но не в PyCharm. Нужно ли мне также указывать на java внутри этого? Благодаря!
Джеймс
1
Обновленные инструкции по установке Java 8 JDK на macOS: «brew tap AdoptOpenJDK / openjdk; brew cask install accepttopenjdk8»
Джорис
3
@James, спасибо за ответ, я решил обновить некоторые учетные данные git. в любом случае java8 больше не доступен, потому что Oracle сначала установила лицензию на регистрацию. Так что этот подход больше не работает. Чтобы установить java8, вам нужно увидеть этот ответ. stackoverflow.com/questions/24342886/…
Гонсало Гарсия
89

Я столкнулся с этой проблемой при запуске Jupyter Notebook и 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 по умолчанию
Xiao
Спасибо! мой случай был точно таким же, как и ваш.
Кенни Айрес
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, чтобы получить полное представление о настройке переменной 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 и запустите в терминале

Раджита Фернандо
источник
4

В Windows (Windows 10) вы можете решить проблему, установив jdk-8u201-windows-x64.exe и сбросив системную переменную среды на правильную версию JAVA JDK:

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

Не забудьте перезапустить терминал, иначе сброс переменной окружения не сработает.

Tomasvanoyen
источник
пожалуйста, не забудьте перезагрузить терминал!
риши джайн
2

Для пользователей Debian 10 «buster» в 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 путем изменения переменных JAVA_HOME и PATH env (как рекомендовано большинством людей), вы заметите, что когда вы запустите свой Spark, используя конфигурацию запуска PyCharm, он все равно не подберет правильный Ява. Похоже, что с PyCharm есть проблема (я использую PyCharm Professional 2020.2 в Mac Catalina). Кроме того, когда вы запускаете его с помощью терминала PyCharm, он работает нормально. Это подтверждает, что с PyCharm что-то не так. Чтобы конфигурация запуска PyCharm подбирала новый JAVA, мне пришлось специально добавить переменную среды JAVA_HOME в конфигурацию запуска, как показано ниже: введите описание изображения здесь

и это сработало!

Другой вариант, который также работает, - это проверить Include system environment variables optionв Environment Variablesокне в конфигурации запуска (см. Снимок экрана выше) и перезапустить PyCharm.

Heapify
источник
Хороший улов. Я случайно сделал не тот снимок экрана. Сейчас это исправлено
Heapify
0

У меня такая же проблема в Windows, и я добавил JAVA_HOME в путь к переменной окружения:

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

Чаймае Ахмед
источник
1
Привет, я сделал то же самое. Тем не менее, я получаю ту же ошибку. Вы что-нибудь еще изменили? C: \ Program Files \ Java \ jdk-11.0.2
Gautam
@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
ak6o
источник
0

В macOS: установите Java8 на свой ноутбук, используя следующие команды:

brew tap AdoptOpenJDK/openjdk
brew cask install adoptopenjdk8
иосеф
источник
-1

Эта проблема возникает из-за версии Java, которую вы установили в переменной среды JAVA_HOME.

СТАРЫЙ путь 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, в collect 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