2013-09-22 3 views
0

J'ai un programme java simple appelé putmerge que j'essaie d'exécuter. J'y suis allé depuis 6 heures, j'ai fait des recherches sur de nombreux sites sur le web mais je n'ai pas trouvé de solution. Fondamentalement, j'essaie de construire le pot avec toutes les bibliothèques de classe avec la commande suivante:Programme Java personnalisé Hadoop

javac -classpath *:lib/* -d playground/classes playground/src/PutMerge.java 

Et puis je construis le pot avec la commande suivante.

jar -cvf playground/putmerge.jar -C playground/classes/ . 

Et puis je tente de l'exécuter avec la commande suivante:

bin/hadoop jar playground/putmerge.jar org.scd.putmerge "..inputPath.." "..outPath" 

..

Exception in thread "main" java.lang.ClassNotFoundException: com.scd.putmerge 
     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:424) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
     at java.lang.Class.forName0(Native Method) 
     at java.lang.Class.forName(Class.java:270) 
     at org.apache.hadoop.util.RunJar.main(RunJar.java:153) 

J'ai essayé chaque permutation/combinaison pour exécuter ce pot simple, mais je toujours obtenir une sorte d'exception comme indiqué ci-dessus.

Mon code source:

package org.scd.putmerge; 

import java.io.IOException; 
import java.util.Scanner; 

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.FSDataInputStream; 
import org.apache.hadoop.fs.FSDataOutputStream; 
import org.apache.hadoop.fs.FileStatus; 
import org.apache.hadoop.fs.FileSystem; 

import org.apache.hadoop.fs.Path; 

/** 
* 
* @author Anup V. Saumithri 
* 
*/ 
public class PutMerge 
{ 
    public static void main(String[] args) throws IOException 
     { 
     Configuration conf = new Configuration(); 
     FileSystem hdfs = FileSystem.get(conf); 
     FileSystem local = FileSystem.getLocal(conf); 

     Path inputDir = new Path(args[0]); 
     Path hdfsFile = new Path(args[1]); 



     try 
     { 
      FileStatus[] inputFiles = local.listStatus(inputDir); 
      FSDataOutputStream out = hdfs.create(hdfsFile); 

      for(int i=0; i<inputFiles.length; i++) 
      { 
       System.out.println(inputFiles[i].getPath().getName()); 
       FSDataInputStream in = local.open(inputFiles[i].getPath()); 

       byte buffer[] = new byte[256]; 
       int bytesRead = 0; 
       while((bytesRead = in.read(buffer)) > 0) 
       { 
        out.write(buffer, 0, bytesRead); 
       } 
       in.close(); 
      } 
      out.close(); 
     } 
     catch(IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 
} 

Répondre

1

La façon dont vous mettez votre classe PutMerge à l'intérieur du pot peut être un peu incorrect.

Si vous faites un jar tf putmerge.jar, vous devez voir la classe PutMerge dans le chemin mentionné dans votre paquet (org.scd.putmerge) dans votre code (c'est-à-dire org/scd/putmerge).

Si ce n'est pas le cas, essayez ce qui suit pour y parvenir. Assurez-vous d'avoir copié PutMerge.class dans le répertoire org/scd/putmerge /.

jar -cvf playground/putmerge.jar org/scd/putmerge/PutMerge.class 

Ensuite, vérifiez à nouveau avec jar tf putmerge.jar pour vérifier si maintenant voir org/scd/putmerge/PutMerge.clas s dans la sortie.

Si tout va bien, vous pouvez essayer d'exécuter à nouveau le pot hadoop. Mais en regardant les erreurs, je vois que vous n'avez pas réellement inclus la classe PutMerge avec le paquet. Vous devez utiliser org.scd.putmerge.PutMerge. Ainsi, la bonne façon devrait être quelque chose comme -

bin/hadoop jar playground/putmerge.jar org.scd.putmerge.PutMerge "..inputPath.." "..outPath" 
+0

Brilliant! Cela a résolu mon problème. Merci beaucoup. Pour les enregistrements, le problème était avec ma spécification de paquetage dans la commande bin/hadoop jar. Je l'ai changé à org.scd.putmerge.PutMerge comme vous l'avez mentionné ci-dessus ...... et il a commencé à travailler .... – Ace

Questions connexes