【问题标题】:ClassNotFoundException when submitting JAR to Spark via spark-submit通过 spark-submit 向 Spark 提交 JAR 时出现 ClassNotFoundException
【发布时间】:2017-08-26 22:17:04
【问题描述】:

我正在努力使用 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 中按预期运行。

【问题讨论】:

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


    【解决方案1】:

    根据您上面的描述 ,你没有给出正确的类名,所以它找不到那个类。

    只需将 SimpleSparkScala 替换为 SimpleScalaSpark

    尝试运行此命令:

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

    【讨论】:

    • 是的,对不起。我也发现了这一点并更新了问题,但这实际上不是问题。我现在认为这与 Intellij 构建 JAR 的方式有关。如果我使用“来自具有依赖项的模块...”选项(例如 stackoverflow.com/questions/1082580/…),它会失败,如上所示。但是,如果我手动设置 JAR 设置,它就可以工作。我不确定为什么“快速设置”不起作用。
    • 如果您在本地安装上运行 spark,您应该添加 % 'provided" 到 spark 依赖项,然后 sbt clean 和 sbt 程序集。
    【解决方案2】:

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

    如果 SimpleScalaSpark 类没有出现在上一个命令的输出中,这意味着你的 jar 没有正确构建。

    【讨论】:

      【解决方案3】:

      IDE 在许多方面与 shell 不同。 我相信对于 shell 你需要添加 --jars 参数

      spark submit add multiple jars in classpath

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 我无法弄清楚旧版本的来源。
        猜你喜欢
        • 2017-12-25
        • 1970-01-01
        • 2016-09-04
        • 2014-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-01
        • 2015-10-27
        相关资源
        最近更新 更多