Scala 设置火花图时获取NoSuchMethodError
我得到了一个与遇到的错误类似的错误-我可以使用spark shell运行GraphX,但是当我尝试在jar文件上使用spark submit时,我得到了一个NoSuchMethodError。这是它抱怨的一句话:Scala 设置火花图时获取NoSuchMethodError,scala,apache-spark,spark-graphx,Scala,Apache Spark,Spark Graphx,我得到了一个与遇到的错误类似的错误-我可以使用spark shell运行GraphX,但是当我尝试在jar文件上使用spark submit时,我得到了一个NoSuchMethodError。这是它抱怨的一句话: val myGraph: Graph[(String, Long, String), Int] = Graph.apply(userRecords, userConnectionEdges) 这给了我以下错误: Exception in thread "main" java.lang
val myGraph: Graph[(String, Long, String), Int] = Graph.apply(userRecords, userConnectionEdges)
这给了我以下错误:
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.spark.graphx.
Graph$.apply$default$4()Lorg/apache/spark/storage/StorageLevel;
at MyProject$.main(MyProject.scala:53)
at MyProject.main(MyProject.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.apache.spark.deploy.SparkSubmit$.launch(SparkSubmit.scala:292)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:55)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
代码使用sbt汇编构建,所以我不知道哪里出了问题
编辑:我创建了一个新的scala项目来获取代码,并将其构建到一个jar文件中。这是scala文件:
/* GraphTest.scala */
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.graphx._
import org.apache.spark.rdd.RDD
object GraphTest {
def main(args: Array[String]) {
// Set up environment
val conf = new SparkConf()
val sc = new SparkContext(conf)
// Set up the vertices
val vertexArray = Array(
(1L, ("Alice", 28)),
(2L, ("Bob", 27)),
(3L, ("Charlie", 65)),
(4L, ("David", 42)),
(5L, ("Ed", 55)),
(6L, ("Fran", 50))
)
// Set up the edges
val edgeArray = Array(
Edge(2L, 1L, 7),
Edge(2L, 4L, 2),
Edge(3L, 2L, 4),
Edge(3L, 6L, 3),
Edge(4L, 1L, 1),
Edge(5L, 2L, 2),
Edge(5L, 3L, 8),
Edge(5L, 6L, 3)
)
// Convert arrays to RDDs
val vertexRDD: RDD[(Long, (String, Int))] = sc.parallelize(vertexArray)
val edgeRDD: RDD[Edge[Int]] = sc.parallelize(edgeArray)
// Create graph and print vertex data
val graph: Graph[(String, Int), Int] = Graph(vertexRDD, edgeRDD)
graph.vertices.filter { case (id, (name, age)) => age > 30 }.collect.foreach {
case (id, (name, age)) => println(s"$name is $age")
}
}
}
以下是生成设置:
import AssemblyKeys._
assemblySettings
name := "graphtest"
version := "1.0"
scalaVersion := "2.10.3"
libraryDependencies += "org.apache.spark" % "spark-graphx_2.10" % "1.2.1" % "provided"
我可以在代码上运行sbt汇编,但是当我运行
..\spark\bin\spark-submit --class GraphTest target\scala-2.10\graphtest-assembly-1.0.jar
我得到了NoSuchMethodError。看起来您只是为graphx添加了一个依赖项,而不是整个Spark;EG<代码>图书馆依赖+ =“Org.Apache .Snk”%%“Spore Core”%“1.2.1”%“提供” < P>看起来可能是您使用“依赖项”来排除一些JAR文件,首先考虑使用“提供”依赖项。我猜它们不是程序集的一部分,因此在调用
spark submit
时没有得到部署,这是一个版本问题-我使用的是Databricks培训中的SBT和spark,这是当前版本后面的几个版本。这将适用于最新版本的SBT(v0.13.7)、Scala(2.10.4)和Spark(1.2.1)
在我开始工作之后,我遇到了Spark/Hadoop/winutils.exe错误。最终,我让它全部正常工作:)可能是版本不匹配?我无法重现您的问题。我输入了上一次提交的代码,效果很好。我还能够创建一个显式调用apply的图形(而不仅仅是
图形(顶点、边)
),而不会出现任何错误。我所能看到的唯一区别是,我首先将import org.apache.spark.graphx.\导入我的REPL会话。你能发布一个完整的REPL会话来重现这个问题吗?将其添加到构建文件中,但我仍然得到了错误。我在project/plugins.sbt文件中有“addSbtPlugin(“com.eed3si9n”%”sbt assembly“%”0.11.2“)。还有什么我应该添加的吗?它必须是特定于Graph类的,因为我可以毫无问题地使用Edge类。