2

我正在努力使用​​將JAR提交給Apache Spark。當通過spark-submit將JAR提交給Spark時發生ClassNotFoundException

爲了使事情更容易,我試驗過使用此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 --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中按預期運行。

回答

1

根據以上描述 ,你沒有給出正確的類名,所以它無法找到該類。

只需更換SimpleSparkScalaSimpleScalaSpark

嘗試運行此命令:

./spark-submit --class SimpleScalaSpark --master本地[*]〜/文檔/星火/斯卡拉/supersimple/out/artifacts/supersimple_jar/supersimple.jar

+1

Yes.Sorry。我也發現了這個問題,並更新了這個問題,但這不是問題。我現在認爲這與Intellij構建JAR的方式有關。如果我使用「From modules with dependencies ...」選項(例如http://stackoverflow.com/questions/1082580/how-to-build-jars-from-intellij-properly),它將失敗,如上所述。但是,如果我手動設置JAR設置,它將起作用。我不確定爲什麼「快速設置」不起作用。 – dommer

+0

如果你在本地安裝運行spark,你應該添加%'提供的「來激發依賴關係,然後清理sbt程序集。 – fpopic

1

看起來可能是您的廣口瓶中的問題。您可以檢查哪些類存在於你的罐子使用命令: 六supersimple.jar

如果SimpleScalaSpark類不會出現在一個命令的輸出,這意味着你的罐子沒有正確建立。

0

我正在觀察ClassNotFound上新引入的類。我正在使用一個胖罐子。我驗證了JAR文件包含每個節點中所有副本中的新類文件。 (我正在使用常規文件系統來加載Spark應用程序,而不是hdfs或http URL)。 工作人員加載的JAR文件沒有我引入的新類。這是一箇舊版本。 我發現解決這個問題的唯一方法是每次調用spark-submit腳本時爲JAR使用不同的文件名。

+0

我無法弄清舊版本來自哪裏。 – cerebrotecnologico