使用--jars选项时,Spark会抛出ClassNotFoundException

时间:2014-07-20 22:05:01

标签: apache-spark

我试图遵循此处描述的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选项并再次运行程序(我实际上还没有开始使用这些库)。这里的问题是什么?我应该如何添加外部罐子?

2 个答案:

答案 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作业。我有同样的问题,并将名称更改为完整的包和类名称修复它。希望有所帮助!