【问题标题】:Spark throws ClassNotFoundException when using --jars optionSpark 在使用 --jars 选项时抛出 ClassNotFoundException
【发布时间】:2014-09-11 09:13:05
【问题描述】:

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

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    您的 SimpleApp 类是否在任何特定包中?看来您需要在命令行中包含完整的包名称。因此,如果 SimpleApp 类位于 com.yourcompany.yourpackage 中,您必须使用 --class "com.yourcompany.yourpackage.SimpleApp" 而不是 --class "SimpleApp" 提交 Spark 作业。我遇到了同样的问题,将名称更改为完整的包和类名修复了它。希望对您有所帮助!

    【讨论】:

    • 没有。它在默认包中。我只是想把它放在一个特定的包里,但还是没有运气。正如我所说,只有当我尝试使用 --jars 选项添加第三方库时它才会失败。
    【解决方案2】:

    根据spark-submit--help--jars 选项需要一个 逗号 分隔的本地 jar 列表,以包含在驱动程序和执行程序类路径中。

    我认为这里发生的情况是 /home/linpengt/workspace/scala-learn/spark-analysis/target/pack/lib/* 正在扩展为 空格 分隔的 jar 列表,并且列表中的第二个 JAR 被视为应用程序 jar。

    一种解决方案是使用您的 shell 构建以逗号分隔的 jar 列表;这是基于this answer on StackOverflow 在bash 中执行此操作的一种快速方法(有关处理包含空格的文件名的更复杂方法,请参见该答案):

    spark-submit --jars $(echo /dir/of/jars/*.jar | tr ' ' ',') \
        --class "SimpleApp" --master local[4] path/to/myApp.jar
    

    【讨论】:

    • 谢谢乔希!这就是问题所在。
    • 我刚花了一些时间和我的老板一起追查 Scala 源代码,但我们没有弄明白 谢谢!!!这难道不是一个独立的问题和答案吗?我将针对 spark-submit 文档页面提交一个错误。
    • @jimlohse 当然!您甚至可以自己提交拉取请求以更新文档;见cwiki.apache.org/confluence/display/SPARK/Contributing+to+Spark
    • @JoshRosen 我注意到即使在 1.6.0 文档 spark.apache.org/docs/latest/submitting-applications.html 中 --repository 和 --packages 参数指定逗号,但不清楚——罐子。谢谢,提交了带有建议编辑的拉取请求,并在此处发布了这个问题:stackoverflow.com/questions/34738296/…
    • 你拯救了我的一天 :)
    猜你喜欢
    • 2016-01-10
    • 2022-07-07
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 2021-02-05
    • 2017-12-25
    相关资源
    最近更新 更多