2015-02-18 4 views
2

Я получаю аналогичную ошибку с той, с которой столкнулся here - Я могу запустить GraphX, используя искровую оболочку, но я получаю NoSuchMethodError, когда пытаюсь использовать spark-submit на jar файл. Это линия, что она жалуется:Получение NoSuchMethodError при настройке графика Spark GraphX ​​

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, так что я не то, что происходит не так.

EDIT: Я создал новый проект 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 ,

+0

Возможно, несоответствие версии? –

+0

Я не могу воспроизвести вашу проблему. Я ввел код из предыдущего представления, и он работал нормально. Я также смог создать явно вызывающий Graph, вместо того, чтобы просто «Graph (вершины, ребра)»), без каких-либо ошибок. Единственное различие, которое я вижу, это то, что я начал с импорта импорта org.apache.spark.graphx._ в мой сеанс REPL. Можете ли вы опубликовать полный сеанс REPL, который воспроизводит проблему? –

ответ

1

Оказывается, проблема с версией - я использовал SBT и Spark из обучения Databricks, которые представляют собой несколько версий за текущей версией. Это будет работать с последней версией SBT (v0.13.7), Scala (2.10.4) и Spark (1.2.1).

После того как я получил эту работу, я столкнулся с ошибкой this Spark/Hadoop/winutils.exe. В конце концов я получил все это работает :)

0

Похоже, вы добавляете зависимость только для графика, а не для Spark в целом; например libraryDependencies += "org.apache.spark" %% "spark-core" % "1.2.1" % "provided".

+0

Добавил это в файл сборки, но я все еще получаю ошибку. – John

0

Похоже, что это, вероятно, ваше использование «provided» зависимостей: «Чтобы исключить некоторый файл jar, сначала рассмотрите возможность использования« предоставленной »зависимости». Я предполагаю, что они не являются частью вашей сборки и, таким образом, не развертываются при вызове spark-submit.

+0

У меня есть "addSbtPlugin (" com.eed3si9n "%" sbt-assembly "%" 0.11.2 ")" в файле project/plugins.sbt. Есть ли что-то еще, что я должен добавить? – John

+0

Он должен быть чем-то специфичным для класса Graph, так как я могу использовать класс Edge без проблем. – John

Смежные вопросы