2016-09-06 1 views
1

Je suis nouveau sur Hadoop et je souhaite exécuter un travail MapReduce. Cependant, j'ai l'erreur que le hadoop ne trouve pas la classe de mappeur. Ceci est l'erreur:Hadoop ne trouve pas la classe de mappeur

INFO mapred.JobClient: Task Id : attempt_201608292140_0023_m_000000_0, Status : FAILED 
java.lang.RuntimeException: java.lang.ClassNotFoundException: TransMapper1 
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:857) 
    at org.apache.hadoop.mapreduce.JobContext.getMapperClass(JobContext.java:199) 
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:718) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:364) 
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:422) 

J'ai vérifié l'autorisation de mon fichier jar et il est très bien. Ici, il est la permission du fichier jar:

-rwxrwxrwx. 

Ici, il est le code pour le code qui lance la tâche MapReduce:

import java.io.File; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.NullWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 

public class mp{ 

public static void main(String[] args) throws Exception { 

    Job job1 = new Job(); 
    job1.setJarByClass(mp.class); 
    FileInputFormat.addInputPath(job1, new Path(args[0]));     
    String oFolder = args[0] + "/output"; 
    FileOutputFormat.setOutputPath(job1, new Path(oFolder)); 
    job1.setMapperClass(TransMapper1.class); 
    job1.setReducerClass(TransReducer1.class); 
    job1.setMapOutputKeyClass(LongWritable.class); 
    job1.setMapOutputValueClass(DnaWritable.class); 
    job1.setOutputKeyClass(LongWritable.class); 
    job1.setOutputValueClass(Text.class); 
} 
} 

Et voilà la classe Mapper (TransMapper1):

import java.io.IOException; 
import java.util.StringTokenizer; 
import org.apache.hadoop.io.DoubleWritable; 
import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Mapper; 

public class TransMapper1 extends Mapper<LongWritable, Text, LongWritable, DnaWritable> { 

    @Override 
    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { 

     String line = value.toString(); 
     StringTokenizer tokenizer = new StringTokenizer(line); 
     LongWritable bamWindow = new LongWritable(Long.parseLong(tokenizer.nextToken())); 
     LongWritable read = new LongWritable(Long.parseLong(tokenizer.nextToken())); 
     LongWritable refWindow = new LongWritable(Long.parseLong(tokenizer.nextToken())); 
     IntWritable chr = new IntWritable(Integer.parseInt(tokenizer.nextToken())); 
     DoubleWritable dist = new DoubleWritable(Double.parseDouble(tokenizer.nextToken())); 
     DnaWritable dnaW = new DnaWritable(bamWindow,read,refWindow,chr,dist); 
     context.write(bamWindow,dnaW); 
    } 
} 

Je compile le paquet en utilisant les commandes suivantes:

javac -classpath $MR_HADOOPJAR ${rootPath}mp/src/*.java 
jar cvfm $mpJar $MR_MANIFEST ${rootPath}mp/src/*.class 

Ce sont les résultats de jar tf mp/src/commande mp.jar:

META-INF/ 
META-INF/MANIFEST.MF 
mnt/miczfs/tide/mp/src/DnaWritable.class 
mnt/miczfs/tide/mp/src/mp.class 
mnt/miczfs/tide/mp/src/TransMapper1.class 
mnt/miczfs/tide/mp/src/TransMapper2.class 
mnt/miczfs/tide/mp/src/TransReducer1.class 
mnt/miczfs/tide/mp/src/TransReducer2.class 

et je suis en cours d'exécution du travail avec ceci:

mpJar=${rootPath}mp/src/mp.jar 
mp_exec=mp 
export HADOOP_CLASSPATH=$mpJar 
hadoop $mp_exec <input path> 

Aussi, j'ai essayé cette commande trop :

hadoop jar $mp_exec <input path> 

je changé la façon dont je crée le fichier jar dans cette commande:

jar cf $mpJar $MR_MANIFEST ${rootPath}mp/src/*.class 

Et avec ce changement, l'erreur a été modifiée à ceci:

Exception in thread "main" java.lang.ClassNotFoundException: mp 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    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:348) 
    at org.apache.hadoop.util.RunJar.main(RunJar.java:153) 

Alors, avant que mon problème était que le programme ne peut pas trouver la classe Mapper, droite, il ne peut maintenant trouver la classe principale !!! Des pensées??

Merci les gars

+0

fait l'erreur que vous obtenez est à partir d'une classe manquante @ java.lang.ClassNotFoundException: TransMapper1, êtes-vous sûr de compiler toutes les sources java dans le bon répertoire sur HDFS afin que hadoop puisse trouver TransMapper1? Vous pouvez également essayer de créer un fichier jar à partir de votre classe et de le lancer dans hadoop – D3181

+0

@ Dean219 J'ai ajouté la façon dont je compile le code et l'exécute. Pouvez-vous me dire où devrais-je mettre les fichiers compilés sur le HDFS, j'ai seulement déplacé les fichiers d'entrée vers le HDFS. Dois-je déplacer des fichiers jar aussi? –

Répondre

2

HADOOP_CLASSPATH doit spécifier le dossier dans lequel le fichier JAR se trouve, grâce à laquelle il est incapable de trouver la définition de classe.

+0

J'ai ajouté la façon dont je compile et exécute le code et je place le HADOOP_CLASSPATH à l'emplacement du fichier jar. Mais le fichier jar n'est pas sur HDFS. C'est sur local, cela pourrait-il conduire à la question? –

+0

Je n'ai pas indiqué l'emplacement des fichiers mp.class et je le corrige et cela fonctionne.Merci –

0

en cours d'emploi MapReduce de commande hadoop nécessite fichier jar, MainClass et autres args ..

Usage: hadoop jar <jar> [mainClass] args... 

Donc commande pour l'exécution de votre pot d'application doit être:

hadoop jar $mpJar $mp_exec <inputpath> 
+0

Merci pour votre réponse. Mais appeler ainsi fait que l'argument 0 soit $ mp_exec. Et quand j'ai corrigé l'indice de l'argument. Il a produit la même erreur .. Ne fonctionne toujours pas –

+0

Aucun argument 0 sera le premier arg après mainclass ($ mp_exec) - dans votre cas, il sera entrée path –

+0

ce n'est pas vrai monsieur, je juste imprimer le nombre d'arguments avant de faire quoi que ce soit sur mp.java et il imprime 2 !!! au lieu d'un. –