Error de Spark: versión principal del archivo de clase no compatible

82

Estoy intentando instalar Spark en mi Mac. He usado home-brew para instalar Spark 2.4.0 y Scala. He instalado PySpark en mi entorno anaconda y estoy usando PyCharm para el desarrollo. He exportado a mi perfil de 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

Sin embargo, no puedo hacer que funcione.

Sospecho que esto se debe a la versión de Java de leer el rastreo. Realmente agradecería ayuda para solucionar el problema. Por favor comente si hay alguna información que pueda proporcionar que sea útil más allá del rastreo.

Estoy teniendo el siguiente error:

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
fuente
2
esta solución funcionó para mí incluso con "Archivo de clase no compatible versión principal 57"
SchwarzeHuhn
REVISIÓN: Para solucionar este problema, edité bash_profile para asegurar que java 1.8 se use como el valor predeterminado global de la siguiente manera: touch ~/.bash_profile; open ~/.bash_profile Agregar export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)y guardar dentro de la edición de texto.
James
Esa solución funciona para cualquier Java en Mac. Libexec no tiene nada que ver con las licencias ni con
Oracle
Infierno de dependencia para Spark. Lo odio.
0x4a6f4672

Respuestas:

90

Edit Spark 3.0 es compatible con Java 11, por lo que deberá actualizar

Spark se ejecuta en Java 8/11, Scala 2.12, Python 2.7 + / 3.4 + y R 3.1+. La compatibilidad con Java 8 anterior a la versión 8u92 está obsoleta a partir de Spark 3.0.0



Respuesta original

Hasta que Spark sea compatible con Java 11, o superior (que con suerte se mencionará en la documentación más reciente cuando lo sea), debe agregar una marca para configurar su versión de Java en Java 8.

A partir de Spark 2.4.x

Spark se ejecuta en Java 8 , Python 2.7 + / 3.4 + y R 3.1+. Para la API de Scala, Spark 2.4.4 usa Scala 2.12. Deberá utilizar una versión de Scala compatible (2.12.x)

En Mac / Unix, consulte asdf-java para instalar diferentes Javas

En una Mac, puedo hacer esto en mi .bashrc,

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

En Windows, consulte Chocolately, pero en serio, solo use WSL2 o Docker para ejecutar Spark.


También puede configurar esto en spark-env.shlugar de configurar la variable para todo su perfil.

Y, por supuesto, todo esto significa que necesitará instalar Java 8 además de su Java 11 existente.

OneCricketeer
fuente
4
Gracias @ cricket_007 cuando intento brew cask install java8 Me sale el siguiente error Cask 'java8' no está disponible: No existe ningún Cask con este nombre.
James
2
Probé lo siguiente que parece funcionar: brew tap caskroom / versiones brew cask install java8
James
1
Esto parece haber solucionado el problema, pero no dentro de PyCharm. ¿Tengo que apuntar a Java dentro de eso también? ¡Gracias!
James
1
Instrucciones actualizadas para instalar Java 8 JDK en macOS: "brew tap AdoptOpenJDK / openjdk; brew cask install adoptopenjdk8"
Joris
3
@James, gracias por responder, lo resolví actualizando algunas credenciales de git. de todos modos java8 ya no está disponible porque Oracle configuró la licencia en el registro primero. Entonces ese enfoque ya no funciona. Para instalar java8, necesita ver esta respuesta. stackoverflow.com/questions/24342886/…
Gonzalo García
89

Me encontré con este problema al ejecutar Jupyter Notebook y Spark usando Java 11. Instalé y configuré Java 8 siguiendo los siguientes pasos.

Instale Java 8:

$ sudo apt install openjdk-8-jdk

Como ya había instalado Java 11, configuré mi Java predeterminado en la versión 8 usando:

$ sudo update-alternatives --config java

Seleccione Java 8 y luego confirme sus cambios:

$ java -version

La salida debe ser similar a:

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)

Ahora puedo ejecutar Spark correctamente en Jupyter Notebook. Los pasos anteriores se basaron en la siguiente guía: https://www.digitalocean.com/community/tutorials/how-to-install-java-with-apt-on-ubuntu-18-04

André Oporto
fuente
1
si está usando sdkman, sdk install java 8.0.212-zuluinstala java 8 y le pregunta si desea usar el java 8 instalado para que sea el java predeterminado
Xiao
¡Gracias! mi caso era exactamente el mismo que el tuyo.
Kenny Aires
19

Descubrí que agregar la ubicación de chispa a través de findpark y java8 con os al comienzo del script es la solución más fácil:

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
fuente
7

El problema es que PySpark requiere Java 8 para algunas funciones. Spark 2.2.1 estaba teniendo problemas con Java 9 y posteriores. La solución recomendada fue instalar Java 8.

puede instalar java-8 específicamente, configurarlo como su java predeterminado y volver a intentarlo.

para instalar java 8,

sudo apt install openjdk-8-jdk

para cambiar la versión predeterminada de Java, siga esto . puedes usar el comando

 update-java-alternatives --list

para enumerar todas las versiones de Java disponibles.

establezca uno predeterminado ejecutando el comando:

sudo update-alternatives --config java

para seleccionar la versión de Java que desee. proporcione el número exacto en la lista proporcionada. luego revise su versión de Java java -versiony debería actualizarse. Establezca también la variable JAVA_HOME.

para configurar JAVA_HOME, debe encontrar la versión y carpeta específicas de Java. Siga esta discusión de SO para tener una idea completa de cómo configurar la variable de inicio de Java. ya que vamos a usar java 8, nuestra ruta de carpeta es /usr/lib/jvm/java-8-openjdk-amd64/. simplemente vaya a la /usr/lib/jvmcarpeta y cruje cuáles son las carpetas disponibles. use ls -lpara ver carpetas y sus enlaces suaves, ya que estas carpetas pueden ser un acceso directo para algunas versiones de Java. luego vaya a su directorio de inicio cd ~y edite el archivo bashrc

cd ~
gedit .bashrc

luego agregue las siguientes líneas al archivo, guárdelo y salga.

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

después de eso, para hacer efectivo lo que hiciste, escribe source ~/.bashrc y ejecuta en la terminal

Rajitha Fernando
fuente
4

En Windows (Windows 10) puede resolver el problema instalando jdk-8u201-windows-x64.exe y restableciendo la variable de entorno del sistema a la versión correcta de JAVA JDK:

JAVA_HOME -> C: \ Archivos de programa \ Java \ jdk1.8.0_201.

No olvide reiniciar el terminal, de lo contrario, el restablecimiento de la variable de entorno no se activará.

tomasvanoyen
fuente
¡No olvide reiniciar el terminal!
rishi jain
2

Para los usuarios de Debian 10 'buster', Java 8 JRE está disponible en el nvidia-openjdk-8-jrepaquete.

Instalarlo con

sudo apt install nvidia-openjdk-8-jre

Luego configúrelo JAVA_HOMEal ejecutar pyspark, por ejemplo:

JAVA_HOME=/usr/lib/jvm/nvidia-java-8-openjdk-amd64/ pyspark
SergiyKolesnikov
fuente
Sugeriría usar AdoptOpenJDK sobre Nvidia para obtener Java
OneCricketeer
1

Solo quería agregar mis dos centavos aquí, ya que ahorrará varias horas de tiempo para las personas que usan PyCharm (especialmente la configuración de ejecución). Después de cambiar su .bashrco .bash_profilepara apuntar a Java 8 modificando las variables de env JAVA_HOME y PATH (como la mayoría de las personas aquí han recomendado), notará que cuando ejecuta su Spark usando la configuración de ejecución de PyCharm, todavía no recogerá la correcta Java. Parece que hay algún problema con PyCharm (estoy usando PyCharm Professional 2020.2 en Mac Catalina). Además, cuando lo ejecuta usando la terminal de PyCharm, funciona bien. Eso confirma que algo anda mal con PyCharm. Para que la configuración de ejecución de PyCharm recoja un nuevo JAVA, tuve que agregar específicamente la variable de entorno JAVA_HOME en la configuración de ejecución como se muestra a continuación:

ingrese la descripción de la imagen aquí

¡Y funcionó!

Otra opción que también funciona es verificar Include system environment variables optionen la Environment Variablesventana en la configuración de ejecución (ver captura de pantalla anterior) y reiniciar PyCharm

Amontonar
fuente
0

Tengo el mismo problema en Windows y agregué JAVA_HOME a la ruta de la variable ambiental:

JAVA_HOME: C: \ Archivos de programa \ Java \ jdk-11.0.1

Chaymae Ahmed
fuente
1
Hola, yo he hecho lo mismo. Aún así, recibo el mismo error. ¿Hay algo más que hayas cambiado? C: \ Archivos de programa \ Java \ jdk-11.0.2
Gautam
@Gautum Como muestran las otras respuestas, necesita Java 8. El error dice explícitamente que la versión 55 (que es Java 11) no es compatible
OneCricketeer
0

Hola, de hecho, para estar seguro de que está colocando el SPARK_HOME PATH correcto, puede usar este script de Python para ubicarlo: 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

En mi Mac, en la terminal:

vim ~/.bashrc

y agrega la ruta:

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

y luego finalmente aplicar el cambio

source ~/.bashrc
ak6o
fuente
0

En macOS: instale Java8 en su computadora portátil con los siguientes comandos:

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

Este problema ocurre debido a la versión de Java que configuró en la variable de entorno JAVA_HOME.

ANTIGUA ruta de JAVA: /usr/lib/jvm/java-1.11.0-openjdk-amd64

Solución: establezca JAVA_HOME en / usr / lib / jvm / java-8-openjdk-amd64

¡¡¡Funcionará!!!

Tenga en cuenta que mi error fue:

Archivo "/home/tms/myInstallDir/spark-2.4.5-bin-hadoop2.7/python/pyspark/rdd.py", línea 816, en recopilar sock_info = self.ctx._jvm.PythonRDD.collectAndServe (self._jrdd .rdd ()) Archivo "/home/tms/myInstallDir/spark-2.4.5-bin-hadoop2.7/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", línea 1257, en el archivo de llamada "/home/tms/myInstallDir/spark-2.4.5-bin-hadoop2.7/python/pyspark/sql/utils.py", línea 79, en deco raise IllegalArgumentException (s.split (':', 1) [1], stackTrace) pyspark.sql.utils.IllegalArgumentException: u'Unupported class file major version 55 '

Tanaji Sutar
fuente
¿Qué agrega esto a la respuesta existente que dice que se requiere Java 8?
OneCricketeer