我试图遵循此处描述的Spark独立应用程序示例 https://spark.apache.org/docs/latest/quick-start.html#standalone-applications
该示例在以下调用中正常运行:
spark-submit --class "SimpleApp" --master local[4] target/scala-2.10/simple-project_2.10-1.0.jar
但是,当我尝试通过--jars
介绍某些第三方库时,它会抛出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)
删除--jars
选项并再次运行程序(我实际上还没有开始使用这些库)。这里的问题是什么?我应该如何添加外部罐子?
答案 0 :(得分:39)
根据spark-submit
的{{1}},--help
选项需要将逗号分隔的本地jar列表包含在驱动程序和执行程序类路径中。
我认为这里发生的事情是--jars
正在扩展到 space 分隔的jar列表中,列表中的第二个JAR被视为应用程序jar。
一种解决方案是使用shell构建以逗号分隔的jar列表;这是基于this answer on StackOverflow在bash中快速完成的方法(请参阅处理包含空格的文件名的更复杂方法的答案):
/home/linpengt/workspace/scala-learn/spark-analysis/target/pack/lib/*
答案 1 :(得分:4)
您的SimpleApp类是否在任何特定包中?您似乎需要在命令行中包含完整的包名称。因此,如果SimpleApp类位于com.yourcompany.yourpackage中,则必须使用--class“com.yourcompany.yourpackage.SimpleApp”而不是--class“SimpleApp”提交Spark作业。我有同样的问题,并将名称更改为完整的包和类名称修复它。希望有所帮助!