运行spark-submit时出错java.lang.ClassNotFoundException

时间:2016-10-14 11:07:08

标签: scala maven apache-spark

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

1)从IntellijIDEA执行Maven Clean和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而不是{{1}有关}?

更新

项目结构(文件夹class目前标记为来源):

scala

的pom.xml

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

1 个答案:

答案 0 :(得分: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

中的<project>...</project>标记内添加以下代码
  <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>

这可以解决您的问题。