2017-03-16 2 views
0

Je rencontre un problème lors de l'utilisation de spark.ml.util.SchemaUtils sur Spark v1.6.0. Je reçois l'erreur suivante:Méthode erreur inconnue sur le cluster, fonctionne localement - les deux versions d'étincelles sont identiques

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.spark.ml.util.SchemaUtils$.appendColumn(Lorg/apache/spark/sql/types/StructType;Ljava/lang/String;Lorg/apache/spark/sql/types/DataType;)Lorg/apache/spark/sql/types/StructType; 
     at org.apache.spark.ml.SchemaTest$.main(SchemaTest.scala:17) 

lors de l'exécution cet exemple minimal sur mon groupe (inspiré par le library Je veux finalement utiliser):

package org.apache.spark.ml 

import org.apache.spark.ml.util.SchemaUtils 
import org.apache.spark.sql.types._ 
import org.apache.spark.mllib.linalg.VectorUDT 

object SchemaTest { 

    def main(args: Array[String]): Unit = { 
    val schema: StructType = 
     StructType(
     StructField("a", IntegerType, true) :: StructField("b", LongType, false) :: Nil 
    ) 

    val transformed = SchemaUtils.appendColumn(schema, "test", new VectorUDT()) 

    } 
} 

Cependant, le même exemple lancé sur mon bureau local fonctionne sans problèmes. De ce que j'ai vu en ligne (par exemple here), ce type de message d'erreur est souvent lié à une incompatibilité de version entre environnement de compilation et environnement d'exécution, mais mon programme, ma distribution d'étincelles locale et ma distribution de cluster ont tous Spark & mllib versions v1.6.0, la même version Scala v2.10.6, et la même version Java v7.

J'ai vérifié le code source de Spark 1.6.0 et l'appendColumn existe dans org.apache.spark.ml.util.SchemaUtils, avec la bonne signature (mais SchemaUtils n'est pas mentionné dans org.apache.spark.ml documentation API .util).

ETA: Extrait de mon fichier pom.xml:

<dependencies> 
    <dependency> 
     <groupId>org.scala-lang</groupId> 
     <artifactId>scala-library</artifactId> 
     <version>2.10.6</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.spark</groupId> 
     <artifactId>spark-core_2.10</artifactId> 
     <version>1.6.0</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.spark</groupId> 
     <artifactId>spark-sql_2.10</artifactId> 
     <version>1.6.0</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.spark</groupId> 
     <artifactId>spark-mllib_2.10</artifactId> 
     <version>1.6.0</version> 
     <scope>provided</scope> 
    </dependency> 

</dependencies> 

Répondre

0

Vous devez vérifier tous les endroits où vous pouvez modifier le chemin de classe pour les travaux en cours d'exécution sur le cluster. Par exemple, ces propriétés:

  • spark.driver.extraClassPath
  • spark.driver.userClassPathFirst
  • spark.executor.extraClassPath
  • spark.executor.userClassPathFirst

Vous devriez aussi Examinez votre processus d'assemblage pour vous assurer que les dépendances que vous pensez emballer sont bien celles que vous empaquetez.

+0

Les fichiers conf de mon étincelle locale sont vides et l'onglet Environnements de l'interface utilisateur Spark sur le cluster n'affiche aucun paramètre pour ClassPath, donc je suppose que les deux versions utilisent les valeurs par défaut. Mon emballage semble également avoir les bonnes versions pour tous (j'ai ajouté les dépendances pom à mon OP). – datasock