我有一个程序试图连接到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>
答案 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}}