通过spark-submit将JAR提交给Spark时出现ClassNotFoundException

时间:2017-04-01 19:25:34

标签: apache-spark intellij-idea jar classnotfoundexception spark-submit

我正努力使用spark-submit向Apache Spark提交JAR。

为了简化操作,我已尝试使用此blog post。代码是

import org.apache.spark.SparkContext
import org.apache.spark.SparkConf

object SimpleScalaSpark { 
  def main(args: Array[String]) {
    val logFile = "/Users/toddmcgrath/Development/spark-1.6.1-bin-hadoop2.4/README.md" // I've replaced this with the path to an existing file
    val conf = new SparkConf().setAppName("Simple Application").setMaster("local[*]")
    val sc = new SparkContext(conf)
    val logData = sc.textFile(logFile, 2).cache()
    val numAs = logData.filter(line => line.contains("a")).count()
    val numBs = logData.filter(line => line.contains("b")).count()
    println("Lines with a: %s, Lines with b: %s".format(numAs, numBs))
  }
}

我正在使用Intellij Idea 2017.1运行构建,并在Spark 2.1.0上运行。当我在IDE中运行它时,一切运行正常。

然后我将其构建为JAR并尝试使用spark-submit,如下所示

./spark-submit --class SimpleScalaSpark --master local[*] ~/Documents/Spark/Scala/supersimple/out/artifacts/supersimple_jar/supersimple.jar

这会导致以下错误

java.lang.ClassNotFoundException: SimpleScalaSpark
    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:229)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:695)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:187)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:212)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:126)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

我对我失踪的东西感到茫然......特别是考虑到它在IDE中按预期运行。

4 个答案:

答案 0 :(得分:1)

根据您的描述 ,您没有提供正确的类名,因此无法找到该类。

SimpleSparkScala 替换为 SimpleScalaSpark

尝试运行此命令:

./ spark-submit --class SimpleScalaSpark --master local [*]〜/ Documents / Spark / Scala / supersimple / out / artifacts / supersimple_jar / supersimple.jar

答案 1 :(得分:1)

看起来你的jar有问题。您可以使用以下命令检查jar中存在哪些类: vi supersimple.jar

如果 SimpleScalaSpark 类未出现在上一个命令的输出中,则表示您的jar未正确构建。

答案 2 :(得分:0)

IDE在许多方面与shell的工作方式不同。 我相信你需要添加--jars参数

spark submit add multiple jars in classpath

答案 3 :(得分:0)

我在我介绍的新类上观察ClassNotFound。我正在使用一个胖罐子。我验证了JAR文件包含每个节点中所有副本的新类文件。 (我使用常规文件系统加载Spark应用程序,而不是hdfs或http URL)。 工作人员加载的JAR文件没有我引入的新类。这是一个旧版本。 我发现解决问题的唯一方法是每次调用spark-submit脚本时为JAR使用不同的文件名。