【问题标题】:Spark submit ClassNotFoundExceptionSpark 提交 ClassNotFoundException
【发布时间】:2020-08-04 22:45:21
【问题描述】:

这个问题与 Apache Spark 本身一样老,但仍然没有一个解决方案对我有帮助。 我有以下类声明:

object Main {
  def main(args: Array[String]): Unit = {
  ...
}

类引用是 org.griat.rcse.Main(在 IntelliJ 中是 ctrl+shift+alt+c),同样留在pom.xml

<groupId>org.griat.rcse</groupId>

我尝试运行它的方式:

spark-submit --master yarn --deploy-mode client --class org.griat.rcse.Main Glonass112-1.0-SNAPSHOT.jar

一旦它工作了,但在代码中发现了一个异常。在我修复它之后,我cleaned 和packaged 它。虽然pom.xml 没有改变(以及路径和类名),但它停止向 Spark 提交,显示ClassNotFoundException

java.lang.ClassNotFoundException: org.griat.rcse.Main
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:348)
        at org.apache.spark.util.Utils$.classForName(Utils.scala:238)
        at org.apache.spark.deploy.SparkSubmit.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:810)
        at org.apache.spark.deploy.SparkSubmit.doRunMain$1(SparkSubmit.scala:167)
        at org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit.scala:195)
        at org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:86)
        at org.apache.spark.deploy.SparkSubmit$$anon$2.doSubmit(SparkSubmit.scala:924)
        at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:933)
        at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

我还添加了maven-jar-plugin,并不是说它会有所帮助:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>org.griat.rcse.Main</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

这种黑魔法的来源是什么,我该如何处理?

【问题讨论】:

  • 确保主类在正确的目录中,或者你可以尝试使用其他插件,如Maven Assembly Plugin,你也可以从项目的根目录添加所有maven内容和主类的位置吗?
  • 你能分享你完整的 pom.xml 吗?

标签: scala apache-spark


【解决方案1】:

您似乎还没有创建一个“胖罐子”,一个包含所有所需依赖项的罐子。如果您不这样做,或者如果“提供”了某些依赖项,则这些依赖项将需要位于整个类路径中(检查以 CLASSPATH 结尾的环境变量。

如前所述,要创建胖 jar,您需要使用 Assembly 插件。请看问题:

What are the differences between Maven Jar Plugin and Maven Assembly Plugin?

这是添加了程序集插件的 pom 文件的an example

相关行:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.3</version>
</plugin>

这里是组装插件的overall instructions -- 请注意,您可能想要使用描述符 XML 文件,在页面底部进行了说明。

您还可以轻松确认您的 jar 是否包含该类:当您运行 jar tf path/to/assembled.jaras documented 时应列出该类。您可以使用grep 使其更容易:jar tf path/to/assembled.jar|grep org.griat.rcse

【讨论】:

  • 嗯,好像 maven 没有将任何类放到 .jar 文件中,也不依赖于这个插件。但是,这似乎是另一个问题的主题。
  • 顺便说一句,手动编译类然后运行package 会有所帮助。
  • pom 文件中必须有maven-assembly-plugin 和配置,以便在运行package 时执行插件。这里是another example
猜你喜欢
  • 2014-10-30
  • 2017-08-26
  • 2017-12-25
  • 2017-11-24
  • 2019-11-13
  • 2020-04-05
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
相关资源
最近更新 更多