Incompatibilité de Type de la valeur de la carte: org.apache.hadoop.io.NullWritable, reçu org.apache.hadoop.io.Texte
Je suis en train de bidouiller un problème existant pour l'adapter à mes besoins..
Essentiellement d'entrée est simple texte
- Je traiter et de transmettre une paire clé/valeur à réducteur
Et je créer un json.. donc il est la clé, mais pas de valeur
Afin de mapper:
Input: Text/Texte
De Sortie: Text/Texte
Réducteur: Texte/Texte
De Sortie: Texte/Aucun
Mes signatures sont comme suit:
public class AdvanceCounter {
/**
* The map class of WordCount.
*/
public static class TokenCounterMapper
extends Mapper<Object, Text, Text, Text> { //<--- See this signature
public void map(Object key, Text value, Context context) //<--- See this signature
throws IOException, InterruptedException {
context.write(key,value); //both are of type text OUTPUT TO REDUCER
}
}
public static class TokenCounterReducer
extends Reducer<Text, Text, Text, **NullWritable**> { //<--- See this signature Nullwritable here
public void reduce(Text key, Iterable<Text> values, Context context) //<--- See this signature
throws IOException, InterruptedException {
for (Text value : values) {
JSONObject jsn = new JSONObject();
//String output = "";
String[] vals = value.toString().split("\t");
String[] targetNodes = vals[0].toString().split(",",-1);
try {
jsn.put("source",vals[1]);
jsn.put("targets",targetNodes);
context.write(new Text(jsn.toString()),null); //no value
} catch (JSONException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
Job job = new Job(conf, "Example Hadoop 0.20.1 WordCount");
//...
//
job.setOutputValueClass(NullWritable.class);
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
Mais à l'exécution j'obtiens cette erreur:
13/06/04 13:08:26 INFO mapred.JobClient: Task Id : attempt_201305241622_0053_m_000008_0, Status : FAILED
java.io.IOException: Type mismatch in value from map: expected org.apache.hadoop.io.NullWritable, recieved org.apache.hadoop.io.Text
at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:1019)
at org.apache.hadoop.mapred.MapTask$NewOutputCollector.write(MapTask.java:691)
at org.apache.hadoop.mapreduce.TaskInputOutputContext.write(TaskInputOutputContext.java:80)
at org.sogou.Stinger$TokenCounterMapper.map(Stinger.java:72)
at org.sogou.Stinger$TokenCounterMapper.map(Stinger.java:1)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
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:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1093)
at org.apache.hadoop.mapred.Child.main(Child.java:249)
OriginalL'auteur Fraz | 2013-06-04
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas spécifié de votre carte des types de sortie, alors il prend la même chose que vous définissez pour votre réducteur, qui sont
Text
etNullWritable
qui est incorrect pour votre mapper. Vous devez effectuer les opérations suivantes pour éviter toute confusion, il est préférable de spécifier tous vos types pour les deux mappeur et réducteur:OriginalL'auteur Charles Menguy