scala jar classpath apache-spark

scala - Spark-submit ClassNotFound excepción



jar classpath (5)

Estoy teniendo problemas con una excepción "ClassNotFound" usando este simple ejemplo:

import org.apache.spark.SparkContext import org.apache.spark.SparkContext._ import org.apache.spark.SparkConf import java.net.URLClassLoader import scala.util.Marshal class ClassToRoundTrip(val id: Int) extends scala.Serializable { } object RoundTripTester { def test(id : Int) : ClassToRoundTrip = { // Get the current classpath and output. Can we see simpleapp jar? val cl = ClassLoader.getSystemClassLoader val urls = cl.asInstanceOf[URLClassLoader].getURLs urls.foreach(url => println("Executor classpath is:" + url.getFile)) // Simply instantiating an instance of object and using it works fine. val testObj = new ClassToRoundTrip(id) println("testObj.id: " + testObj.id) val testObjBytes = Marshal.dump(testObj) val testObjRoundTrip = Marshal.load[ClassToRoundTrip](testObjBytes) // <<-- ClassNotFoundException here testObjRoundTrip } } object SimpleApp { def main(args: Array[String]) { val conf = new SparkConf().setAppName("Simple Application") val sc = new SparkContext(conf) val cl = ClassLoader.getSystemClassLoader val urls = cl.asInstanceOf[URLClassLoader].getURLs urls.foreach(url => println("Driver classpath is: " + url.getFile)) val data = Array(1, 2, 3, 4, 5) val distData = sc.parallelize(data) distData.foreach(x=> RoundTripTester.test(x)) } }

En el modo local, el envío según los documentos genera una excepción "ClassNotFound" en la línea 31, donde se deserializa el objeto ClassToRoundTrip. Curiosamente, el uso anterior en la línea 28 está bien:

spark-submit --class "SimpleApp" / --master local[4] / target/scala-2.10/simpleapp_2.10-1.0.jar

Sin embargo, si agrego parámetros adicionales para "driver-class-path" y "-jars", funciona bien, en local.

spark-submit --class "SimpleApp" / --master local[4] / --driver-class-path /home/xxxxxxx/workspace/SimpleApp/target/scala-2.10/simpleapp_2.10-1.0.jar / --jars /home/xxxxxxx/workspace/SimpleApp/target/scala-2.10/SimpleApp.jar / target/scala-2.10/simpleapp_2.10-1.0.jar

Sin embargo, al enviar a un dev master local, sigue generando el mismo problema:

spark-submit --class "SimpleApp" / --master spark://localhost.localdomain:7077 / --driver-class-path /home/xxxxxxx/workspace/SimpleApp/target/scala-2.10/simpleapp_2.10-1.0.jar / --jars /home/xxxxxxx/workspace/SimpleApp/target/scala-2.10/simpleapp_2.10-1.0.jar / target/scala-2.10/simpleapp_2.10-1.0.jar

Puedo ver en la salida que el ejecutor está buscando el archivo JAR.

Los registros para uno de los ejecutores están aquí:

stdout: http://pastebin.com/raw.php?i=DQvvGhKm

stderr: http://pastebin.com/raw.php?i=MPZZVa0Q

Estoy usando Spark 1.0.2. El ClassToRoundTrip está incluido en el JAR. Preferiría no tener que codificar los valores en SPARK_CLASSPATH o SparkContext.addJar. ¿Alguien puede ayudar?


Debería establecer el SPARK_CLASS_PATH en el archivo spark-env.sh como este:

SPARK_LOCAL_IP=your local ip SPARK_CLASSPATH=your external jars

y deberías enviarlo con el shell de chispa como este : spark-submit --class your.runclass --master spark://yourSparkMasterHostname:7077 /your.jar

y tu código java como este:

SparkConf sparkconf = new SparkConf().setAppName("sparkOnHbase"); JavaSparkContext sc = new JavaSparkContext(sparkconf);

entonces funcionará.


Lo que descubrí fue que si tiene que construir su proyecto sin advertencias, entonces no tiene que escribir código adicional para el maestro y otras cosas. Aunque es una buena práctica, solo puedes evitarla. Como en mi caso, no hubo advertencias en el proyecto, así que pude ejecutarlo sin ningún código adicional. Enlace a la Estructura del Proyecto

En el caso en el que tengo algunas advertencias relacionadas con la compilación, tengo que ocuparme de las rutas JAR, mi URL y el código maestro, así como mientras lo ejecuto.

Espero que pueda ayudar a alguien. Saludos


Si está utilizando el complemento de ensamblaje de Maven y Maven para compilar su archivo jar con el mvn package , asegúrese de que el complemento de ensamblaje esté configurado correctamente para apuntar a la clase principal de su aplicación Spark.

Algo así debería agregarse a su pom.xml para evitar cualquier java.lang.ClassNotFoundException :

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.4.1</version> <configuration> <archive> <manifest> <mainClass>com.my.package.SparkDriverApp</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <skipAssembly>false</skipAssembly> </configuration> <executions> <execution> <id>package</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>


También tuve el mismo problema. Creo que --jars no está enviando los frascos a los ejecutores. Después de agregar esto en SparkConf, funciona bien.

val conf = new SparkConf().setMaster("...").setJars(Seq("/a/b/x.jar", "/c/d/y.jar"))

datastax.com/dev/blog/common-spark-troubleshooting es útil.


Tuve el mismo problema. Si el maestro es local, el programa funciona bien para la mayoría de las personas. Si lo configuraron como (también me pasó a mí) "spark: // myurl: 7077" si no funciona. La mayoría de las personas obtienen errores porque no se encontró una clase anónima durante la ejecución. Se resuelve utilizando SparkContext.addJars ("Path to jar").

Asegúrese de que está haciendo las siguientes cosas: -

  • SparkContext.addJars (" Ruta al tarro creado a partir de maven [pista: paquete mvn] ").
  • He usado SparkConf.setMaster (" spark: // myurl: 7077 ") en el código y he proporcionado que el mismo tiene argumentos al enviar el trabajo a spark a través de la línea de comandos.
  • Cuando especifique la clase en la línea de comandos, asegúrese de que esté escribiendo su nombre completo con la URL. por ejemplo: "packageName.ClassName"
  • El comando final debe tener este aspecto de bin / spark-submit --class "packageName.ClassName" --master spark: // myurl: 7077 pathToYourJar / target / yourJarFromMaven.jar

Nota: este jar pathToYourJar / target / yourJarFromMaven.jar en el último punto también se establece en el código como en el primer punto de esta respuesta.