【问题标题】:The error java.lang.ClassNotFoundException when running spark-submit运行 spark-submit 时出现错误 java.lang.ClassNotFoundException
【发布时间】:2016-10-14 11:07:07
【问题描述】:

我想为我的 Scala Spark 应用程序运行 spark-submit。这些是我做的步骤:

1) 从 IntellijIDEA 执行 Maven Clean and Package 以获取 myTest.jar 2) 执行以下 spark-submit 命令:

spark-submit --name 28 --master local[2] --class org.test.consumer.TestRunner \
/usr/tests/test1/target/myTest.jar \
$arg1 $arg2 $arg3 $arg4 $arg5

这是我要运行的TestRunner 对象:

package org.test.consumer

import org.test.consumer.kafka.KafkaConsumer

object TestRunner {

  def main(args: Array[String]) {

    val Array(zkQuorum, group, topic1, topic2, kafkaNumThreads) = args

    val processor = new KafkaConsumer(zkQuorum, group, topic1, topic2)
    processor.run(kafkaNumThreads.toInt)

  }

}

spark-submit 命令失败并显示以下消息:

java.lang.ClassNotFoundException: org.test.consumer.TestRunner
    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:225)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:686)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:185)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:210)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:124)

我真的不明白为什么找不到对象TestRunner,如果正确指定了包...这与使用object而不是class有关吗?

更新:

项目结构(文件夹scala目前标记为Sources):

/usr/tests/test1
  .idea
  src
    main
      docker
      resources
      scala
        org
          test
             consumer
                kafka
                    KafkaConsumer.scala
                TestRunner.scala
    test
  target

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.test.abc</groupId>
    <artifactId>consumer</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>2.11.8</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming_2.11</artifactId>
            <version>1.6.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-streaming-kafka_2.11</artifactId>
            <version>1.6.2</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.module</groupId>
            <artifactId>jackson-module-scala_2.11</artifactId>
            <version>2.7.5</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.7.5</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.7.5</version>
        </dependency>
        <dependency>
            <groupId>org.sedis</groupId>
            <artifactId>sedis_2.11</artifactId>
            <version>1.2.2</version>
        </dependency>
        <dependency>
            <groupId>com.lambdaworks</groupId>
            <artifactId>jacks_2.11</artifactId>
            <version>2.3.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.11</artifactId>
            <version>1.6.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-mllib-local_2.11</artifactId>
            <version>2.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.github.nscala-time</groupId>
            <artifactId>nscala-time_2.11</artifactId>
            <version>2.12.0</version>
        </dependency>
    </dependencies>

</project>

【问题讨论】:

  • 我几乎可以肯定你没有正确打包你的 jar。查看 jar 文件(总指挥官或 winrar ...)并检查 TestRunner 类是否在此 jar 中。如果没有检查你是否在 maven 中正确使用了 scala 插件。
  • 如果您使用的是 Linux 系统,请使用 jar tf /usr/tests/test1/target/myTest.jar 添加 | grep TestRunner 检查您的 jar。
  • 如果您能提供您的目录结构,那就太好了。
  • @ViacheslavRodionov:是的,我在 Linux 上。我运行了这个命令。如果出现错误,是否应该有任何输出?我没有得到任何输出。
  • @VladoDemcak:谢谢。是的,很可能就是这样。我正在尝试将项目内的不同文件夹分配为“Sources”,然后执行mvn -Dscala-2.11 clean package。一直都是同一个问题。如何发现类 TestRunner 是否在 jar 中?

标签: scala maven apache-spark


【解决方案1】:

@FiofanS,问题出在你的目录结构上。

Maven 使用convention over configuratation 策略。这意味着,默认情况下,maven 期望您将遵循它定义的规则集。例如,它希望您将所有代码放在src/main/java 目录中(参见Maven Standard Directory Structure)。但是您的代码在src/main/java 目录中没有。相反,您将它放在src/main/scala 目录中。默认情况下,maven 不会将src/main/scala 视为源位置。

虽然,maven 希望你遵守它定义的规则,但它并不强制执行它们。它还为您提供了可以根据自己的喜好进行配置的方法。
在您的情况下,您将必须明确指示 maven 将 src/main/scala 也视为您的源位置之一。

为此,您必须使用Maven Build Helper Plugin
在您的 pom.xml 中的 &lt;project&gt;...&lt;/project&gt; 标记中添加以下代码

  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>1.7</version>
        <executions>
          <execution>
            <id>add-source</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>add-source</goal>
            </goals>
            <configuration>
              <sources>
                <source>src/main/scala</source>
              </sources>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

这应该可以解决您的问题。

【讨论】:

  • 我试过这个解决方案。特别是,我将源定义为&lt;sources&gt; &lt;source&gt;src/main/scala&lt;/source&gt; &lt;/sources&gt;。这个对吗?然后我从 Intellij 执行 Clean and Package 以获取新的 jar 文件。在此之后我运行spark-submit 并收到了同样的问题。我还解压缩了 jar 文件以查看内容。我没有在其文件夹中看到任何 scala 类。只有 pom.xml 和 pom.properties。顺便说一句,我应该显示主类吗?
  • 是的,您可能必须在清单文件中添加主类。但这不是这里的问题,问题是为什么即使在使用构建助手插件之后您的 TestRunner 类也没有被打包。你确定,你已经添加了我上面提到的确切代码吗?另外,做一件事,现在只需使用命令mvn clean install 并告诉我们TestRunner 类是否被打包在jar 中。
  • 或者直接使用sbt ;)
  • 我终于从这个简单的 scala-maven 项目中复制粘贴了构建部分:github.com/jesperdj/scala-maven-example/blob/master/pom.xml,它现在可以工作了!它与您的解决方案类似,但有一些额外的修改。
  • 谢谢。您能否为此提出另一个问题。我们可能需要为您提供一些代码。在此处发布该代码作为本文的答案是不对的。
猜你喜欢
  • 1970-01-01
  • 2019-10-23
  • 1970-01-01
  • 2012-07-20
  • 2021-02-13
  • 2020-04-07
  • 2021-01-28
  • 2023-03-17
  • 1970-01-01
相关资源
最近更新 更多