2015-06-24 36 views
6

Uso la scintilla 1.4.0/hadoop 2.6.0 (solo per hdfs) e quando eseguo Scala esempio SparkPageRank (esempi/src/main/Scala/org/apache/scintilla/examples/SparkPageRank.scala), mi incontrano il seguente errore:spark 1.4.0 java.lang.NoSuchMethodError: com.google.common.base.Stopwatch.elapsedMillis() J

Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Stopwatch.elapsedMillis()J 
    at org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:245) 
    at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:313) 
    at org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:207) 
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:219) 
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:217) 
    at scala.Option.getOrElse(Option.scala:120) 
    at org.apache.spark.rdd.RDD.partitions(RDD.scala:217) 
    at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:32) 
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:219) 
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:217) 
    at scala.Option.getOrElse(Option.scala:120) 
    at org.apache.spark.rdd.RDD.partitions(RDD.scala:217) 
    at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:32) 
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:219) 
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:217) 
    at scala.Option.getOrElse(Option.scala:120) 
    at org.apache.spark.rdd.RDD.partitions(RDD.scala:217) 
    at org.apache.spark.rdd.RDD$$anonfun$distinct$2.apply(RDD.scala:329) 
    at org.apache.spark.rdd.RDD$$anonfun$distinct$2.apply(RDD.scala:329) 
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:147) 
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:108) 
    at org.apache.spark.rdd.RDD.withScope(RDD.scala:286) 
    at org.apache.spark.rdd.RDD.distinct(RDD.scala:328) 
    at org.apache.spark.examples.SparkPageRank$.main(SparkPageRank.scala:60) 
    at org.apache.spark.examples.SparkPageRank.main(SparkPageRank.scala) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:621) 
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:170) 
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:193) 
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:112) 
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) 

io non sono estremamente familiarità con Java, ma è sembra che si tratta di un problema di guava versione

Le seguenti informazioni potrebbero essere helpfup:

01.235.164,106 mila
$ find ./spark -name *.jars | grep guava 
./lib_managed/bundles/guava-16.0.1.jar 
./lib_managed/bundles/guava-14.0.1.jar 

parte del file di esempi/pom.xml:

... 
<dependency> 
     <groupId>org.apache.cassandra</groupId> 
     <artifactId>cassandra-all</artifactId> 
     <version>1.2.6</version> 
     <exclusions> 
     <exclusion> 
      <groupId>com.google.guava</groupId> 
      <artifactId>guava</artifactId> 
     </exclusion> 
... 

E in effetti sembra che la classe non contiene il metodo problematico:

$ javap -p /mnt/spark/examples/target/streams/\$global/assemblyOption/\$global/streams/assembly/7850cb6d36b2a6589a4d27ce027a65a2da72c9df_5fa98cd1a63c99a44dd8d3b77e4762b066a5d0c5/com/google/common/base/Stopwatch.class 

Compiled from "Stopwatch.java" 
public final class com.google.common.base.Stopwatch { 
    private final com.google.common.base.Ticker ticker; 
    private boolean isRunning; 
    private long elapsedNanos; 
    private long startTick; 
    public static com.google.common.base.Stopwatch createUnstarted(); 
    public static com.google.common.base.Stopwatch createUnstarted(com.google.common.base.Ticker); 
    public static com.google.common.base.Stopwatch createStarted(); 
    public static com.google.common.base.Stopwatch createStarted(com.google.common.base.Ticker); 
    public com.google.common.base.Stopwatch(); 
    public com.google.common.base.Stopwatch(com.google.common.base.Ticker); 
    public boolean isRunning(); 
    public com.google.common.base.Stopwatch start(); 
    public com.google.common.base.Stopwatch stop(); 
    public com.google.common.base.Stopwatch reset(); 
    private long elapsedNanos(); 
    public long elapsed(java.util.concurrent.TimeUnit); 
    public java.lang.String toString(); 
    private static java.util.concurrent.TimeUnit chooseUnit(long); 
    private static java.lang.String abbreviate(java.util.concurrent.TimeUnit); 
} 

Vorrei capire meglio la problema e, se possibile, imparare come risolverlo :-)

risposta

4

Il metodo elapsedMilis() è stato rimosso in Guava 16. (O era stato pianificato di essere rimosso - comunque lì s nessun metodo con questo nome nella tua inserzione.)

Per quanto mi ricordo ci dovrebbe essere qualcosa come TimeUnit.MILLISECONDS in guava 16, o è possibile convertire manualmente divadendo 1000000000.0.

+0

Buona nota, grazie. Comunque la risposta sto cercando dettagli sul perché la combinazione di hadoop/spark che sto usando non funzioni, e cosa posso fare per risolverlo o aggiornarlo. – Bacon

+0

L'esclusione nel pom.xml significa (più o meno) che non si aggiunge il jar specificato nel classpath durante la creazione del progetto. Forse è questo il problema? Quindi forse dovresti rimuovere la parte di esclusione? Potrebbe essere che l'app ignori la versione precedente della libreria? Prova a leggere il docu maven sull'argomento: https://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html – kamirru

+0

Segnalo come risposta accettata, per essere giusto! il setup che sto usando e che sembra funzionare è spark 1.4.0 e hadoop 2.5.2, usando la versione spark pre-costruita. – Bacon

0

Provare ad aggiornare Hadoop da 2.6.0 a 2.6.5. Nel mio caso ha risolto il problema con Cronometro durante l'utilizzo della funzione HBaseAdmin.tableExists (altre dipendenze: Hbase 1.2.0, Spark 2.0.1, Scala 2.11.8), sebbene la soluzione per questo problema in Hbase sia pianificata per essere rilasciata in 1.3.0, che al momento non è disponibile per la produzione link

Problemi correlati