Spark throws ClassNotFoundException lors de l'utilisation de --pots option
J'essayais de suivre l'Étincelle de l'application autonome exemple décrit ici
https://spark.apache.org/docs/latest/quick-start.html#standalone-applications
L'exemple fonctionnait bien avec l'invocation suivante:
spark-submit --class "SimpleApp" --master local[4] target/scala-2.10/simple-project_2.10-1.0.jar
Cependant, quand j'ai essayé d'introduire certaines librairies tierces via --jars
, il jette ClassNotFoundException
.
$ spark-submit --jars /home/linpengt/workspace/scala-learn/spark-analysis/target/pack/lib/* \
--class "SimpleApp" --master local[4] target/scala-2.10/simple-project_2.10-1.0.jar
Spark assembly has been built with Hive, including Datanucleus jars on classpath
Exception in thread "main" java.lang.ClassNotFoundException: SimpleApp
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at org.apache.spark.deploy.SparkSubmit$.launch(SparkSubmit.scala:300)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:55)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Retrait de la --jars
option et le programme s'exécute à nouveau (je n'ai pas fait de commencer à utiliser ces bibliothèques encore). Quel est le problème ici? Comment dois-je ajouter externes de pots?
Vous devez vous connecter pour publier un commentaire.
Selon
spark-submit
's--help
, le--jars
option attend un virguleliste séparée des locaux pots à inclure sur le pilote et exécuteur testamentaire classpath.Je pense que ce qui se passe ici est que
/home/linpengt/workspace/scala-learn/spark-analysis/target/pack/lib/*
est en expansion dans un espaceliste séparée des jarres et la deuxième POT dans la liste est traitée comme l'application jar.Une solution est d'utiliser votre shell pour construire une liste séparée par des virgules des jarres; voici un moyen rapide de le faire en bash, basé sur cette réponse sur StackOverflow (voir cette réponse à des approches plus complexes qui gèrent les noms de fichiers contenant des espaces):
Est votre SimpleApp classe dans un package? Il semble que vous devez inclure le nom complet du paquet dans la ligne de commande. Donc, si le SimpleApp classe est situé dans com.yourcompany.yourpackage, vous devez soumettre l'Étincelle de travail avec la classe "com.yourcompany.yourpackage.SimpleApp" au lieu de --classe "SimpleApp". J'ai eu le même problème et en changeant le nom complet et le nom de la classe, il fixe. Espérons que ça aide!