Spark-soumettre ClassNotFound exception
Je vais avoir des problèmes avec un "ClassNotFound" Exception à l'aide de cet exemple simple:
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 mode local, la soumission conformément à la documentation génère un "ClassNotFound" exception à la ligne 31, où le ClassToRoundTrip objet désérialisé. Étrangement, l'utilisation antérieure sur la ligne 28 est d'accord:
spark-submit --class "SimpleApp" \
--master local[4] \
target/scala-2.10/simpleapp_2.10-1.0.jar
Cependant, si j'ai ajouter des paramètres supplémentaires pour "driver-class-path", et "-pots", il fonctionne très bien, sur le 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
Toutefois, la soumission à un local dev master, génère toujours la même question:
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
Je peux voir à partir de la sortie que le fichier JAR est récupérée par l'exécuteur testamentaire.
Journaux pour l'un de l'exécuteur êtes ici:
stdout: http://pastebin.com/raw.php?i=DQvvGhKm
stderr: http://pastebin.com/raw.php?i=MPZZVa0Q
Je suis en utilisant Étincelle 1.0.2. Le ClassToRoundTrip est inclus dans le POT.
Je préfère ne pas avoir à coder en dur des valeurs dans SPARK_CLASSPATH ou SparkContext.addJar. Quelqu'un peut-il aider?
Je vois le même problème aujourd'hui. Jar est récupérée par l'exécuteur testamentaire et il a la classe de sa recherche, même si elle jette ClassNotFoundException!! Je suis sur la version 1.0.2 btw
Mise à jour - je crois que cela pourrait avoir quelque chose à voir avec la sérialisation. Nous avons trouvé il y a quelques jours que la modification de la méthode de sérialisation fait le problème. Je ne sais pas encore pourquoi, mais il vaut la peine d'essayer.
OriginalL'auteur puppet | 2014-09-05
Vous devez vous connecter pour publier un commentaire.
J'ai eu ce même problème. Si le maître est local, alors le programme fonctionne très bien pour la plupart des gens. Si ils l'ont mis à l' (aussi m'est arrivé) "l'étincelle://myurl:7077" si ne fonctionne pas. La plupart des gens obtenir de l'erreur, car une classe anonyme n'a pas été trouvé lors de l'exécution. Il est résolu en utilisant SparkContext.addJars("Chemin jar").
Assurez-vous de faire les choses suivantes: -
bin/spark-soumettre --classe "packageName.ClassName" --master étincelle://myurl:7077 pathToYourJar/target/yourJarFromMaven.jar
Remarque: ce pot pathToYourJar/target/yourJarFromMaven.jar en dernier point est également définie dans le code comme dans le premier point de cette réponse.
OriginalL'auteur busybug91
J'ai également eu le même problème. Je pense-pots n'est pas d'expédition les pots d'exécuteurs testamentaires.
Après j'ai ajouté ceci dans SparkConf, il fonctionne très bien.
Cette page web pour le dépannage est utile aussi.
OriginalL'auteur Yifei
Vous devez définir la SPARK_CLASS_PATH dans spark-env.sh fichier comme ceci:
et vous devez le présenter avec spark shell comme ce:
spark-submit --class your.runclass --master spark://yourSparkMasterHostname:7077 /your.jar
et votre code java comme ceci:
ensuite, il sera.
OriginalL'auteur capotee
Si vous utilisez Maven et Maven Assembly plugin pour construire votre fichier jar avec
mvn package
, de sorte que l'assemblée plugin est correctement configuré pour pointer vers votre Étincelle de l'application principale de la classe.Quelque chose comme cela devrait être ajouté à votre
pom.xml
pour éviter toutejava.lang.ClassNotFoundException
's:OriginalL'auteur jayfah
Ce que j'ai compris, c'est si vous avez à construire votre projet sans aucun avertissement, alors vous n'avez pas à écrire du code supplémentaire pour le maître et d'autres choses. Même si c'est une bonne pratique, mais vous pouvez simplement l'éviter. Comme ici, dans mon cas, il n'y a pas de mises en garde dans le projet, j'ai donc été en mesure de l'exécuter sans code supplémentaire.
La Structure De Projet Lien
Dans le cas où j'ai une certaine construire des avertissements liés à il y je dois prendre soin de POT de chemins d'accès, l'adresse de ma page et le maître dans le code ainsi que lors de l'exécution.
J'espère que ça peut aider quelqu'un. Cheers !
OriginalL'auteur RushHour