设置 Spark GraphX 图时出现 NoSuchMethodError

Getting NoSuchMethodError when setting up Spark GraphX graph

我遇到了与遇到的错误类似的错误 here - 我可以 运行 GraphX 使用 spark shell,但是当我尝试在 jar 文件上使用 spark-submit。这是它抱怨的行:

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()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 项目以从 here 中获取代码并将其构建到一个 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;例如 libraryDependencies += "org.apache.spark" %% "spark-core" % "1.2.1" % "provided".

看起来可能是您使用了“provided”依赖项:"To exclude some jar file, first consider using "提供了“依赖项”。我猜它们不是你程序集的一部分,因此在你调用 spark-submit.

时不会部署

原来是版本问题——我使用的是 Databricks 培训中的 SBT 和 Spark,它们比当前版本低了几个版本。这将适用于最新版本的 SBT (v0.13.7)、Scala (2.10.4) 和 Spark (1.2.1)。

在我开始工作后,我遇到了 this Spark/Hadoop/winutils.exe 错误。最终我得到了所有的工作:)