2014-06-13 15 views
8

Ho creato un'applicazione Apache Spark tramite Java. Tutto ciò che fa è contare le righe contenenti la parola "scintilla" 1000 volte.Appletazione Java Spark: java.lang.ClassNotFoundException

Ecco il mio codice:

public class Example1 { 
    public static void main(String[] args) { 
     String logfile = args[0]; 
     try{ 
      SparkConf conf = new SparkConf(); 
      conf.setAppName("Sample"); 
      conf.setMaster("spark://<master>:7077"); 
      conf.set("spark.executor.memory", "1g"); 
      JavaSparkContext sc = new JavaSparkContext(conf); 
      JavaRDD<String> logData = sc.textFile(logfile).cache(); 
      long count = 0; 
      for(int i=0; i<=1000; i++){ 
       count += logData.filter(new Function<String, Boolean>(){ 
        public Boolean call(String s){ 
         if (s.toLowerCase().contains("spark")) 
          return true; 
         else 
          return false; 
        } 
       }).count(); 
      } 
     } 
     catch(Exception ex){ 
      System.out.println(ex.getMessage()); 
     } 
    } 
} 

Quando si esegue il debug in Eclipse IDE, io sto incontrando java.lang.ClassNotFoundException:

WARN scheduler.TaskSetManager: Loss was due to java.lang.ClassNotFoundException 
java.lang.ClassNotFoundException: org.spark.java.examples.Example1$1 
at java.net.URLClassLoader$1.run(URLClassLoader.java:217) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:205) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:323) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:268) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:270) 

Ho provato anche la distribuzione di questo all'interno del cluster utilizzando spark-submit, ma ancora , si è verificata la stessa eccezione. Ecco una parte della stacktrace:

ERROR Executor: Exception in task ID 4 
java.lang.ClassNotFoundException: org.spark.java.examples.Example1$1 
at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
at java.lang.Class.forName0(Native Method) 

Qualche idea su come risolvere questo problema? Grazie in anticipo!

+0

curioso perché la necessità di eseguire il ciclo 1000x sullo stesso filtro? – maasg

+0

@maasg questo è solo per simulare un possibile lavoro grande/lungo, e controllare quanto tempo ci vorrà quando viene eseguito sul cluster – jaysonpryde

risposta

10

È necessario consegnare il barattolo con il proprio lavoro ai lavoratori. Per fare questo, hanno Maven costruire un vaso e aggiungere quel vaso al contesto:

conf.setJars(new String[]{"path/to/jar/Sample.jar"}); [*] 

Per un lavoro 'vero' si avrebbe bisogno di costruire un vaso con le dipendenze (controllare Maven plug-in ombra), ma per un semplice lavoro senza dipendenze esterne, è sufficiente un semplice contenitore.

[*] Non ho molta familiarità con Spark Java API, assumendo che dovrebbe essere qualcosa del genere.

+0

Grazie per il suggerimento. Lo verificherò e tornerò su di te se funziona – jaysonpryde

+0

@maasg Funziona con il percorso fisico del jar come hai detto nell'esempio sopra, ma quando provo 'conf.setJars (SparkContext.jarOfClass (Application.class). toList()) 'non funziona. Qualche idea? – nir

+0

Jason - dal momento che dici che questo suggerimento ha risolto la tua domanda originale_, dovresti accettarlo. Quindi passa a una nuova domanda con i dettagli della tua [non-risposta] (http://stackoverflow.com/a/24243594/1677912), riferendoti a questo per il contesto. – Mogsdad

1

Ciò può verificarsi anche se non si specifica il nome completo del pacchetto quando si utilizza la riga di comando spark-submit. Se il metodo main per l'applicazione è in test.spark.SimpleApp allora la linea di comando deve essere simile a questa:

./bin/spark-submit --class "test.spark.SimpleApp" --master local[2] /path_to_project/target/spark_testing-1.0-SNAPSHOT.jar 

Aggiungendo solo --class "SimpleApp" non riuscirà con ClassNotFoundException.

Problemi correlati