运行Spark的NoClassDefFoundError取决于neo4j jar(scala)

时间:2018-04-29 05:43:52

标签: scala apache-spark neo4j jar

我有一个程序试图连接到Neo4j数据库并在Spark上运行testApp.scala,然后我使用sbt package将其打包,根据{{3,将a.jar中的依赖包装在neo4j-spark-connector-2.0.0-M2.jar中(我已经拥有resolvers += "Spark Packages Repo" at "http://dl.bintray.com/spark-packages/maven" libraryDependencies += "neo4j-contrib" % "neo4j-spark-connector" % "2.0.0-M2"

spark-submit --class "testApp" a.jar

然而,当我尝试Exception in thread "main" java.lang.NoClassDefFoundError: org/neo4j/spark/Neo4j$时,事实证明是这样的 a NoClassDefFoundError

代码val n = Neo4j(sc)

中的

jar vtf

我还有两件事需要提及

1)我使用a.jar检查testApp.class中的内容,它只有neo4j,其中没有neo4j-spark-connector-2.0.0-M2.jar类,但包裹过程成功(这是否意味着spark-shell --packages neo4j-contrib:neo4j-spark-connector:2.0.0-M2未打包?)

2)我可以使用testApp.scala并在val n = Neo4j(sc)中键入代码,没有问题(例如上面的错误行是 <div class="form-group"> <label for="price">Price</label> <div class="input-group-btn"> <div class="input-group-prepend"> <span class="input-group-text">$</span> <input id="price" type="number" class="form-control" /> <span class="input-group-text">.00</span> </div> </div> </div> 但它可以在spark-shell中工作)< / p>

2 个答案:

答案 0 :(得分:0)

您可以尝试将--jars选项与spark-submit一起使用。例如

./bin/spark-submit --class "fully-qualified-class-name" --master "master-url" --jars "path-of-your-dependency-jar"

或者您也可以使用spark.driver.extraClassPath="jars-class-path"来解决问题。希望这会有所帮助。

答案 1 :(得分:0)

由于.jar中的内容不包含Neo4j类,因此是包装问题。

我们应该修改的是sbt,而不是sbt package,我们应该使用sbt clean assembly代替.jar。这有助于创建一个包含其中所有依赖项的sbt package包。

如果仅使用neo4j-*.jar,则编译进度正常,但不会将.jar打包到NoClassDefError。因此,在运行时它会抛出{{1}}

相关问题