Hadoop: Reducer schreiben Mapper-Ausgabe in Ausgabedatei
Traf ich ein sehr sehr seltsames problem. Die Reduzierstücke Arbeit tun, aber wenn ich überprüfen Sie die Ausgabe-Dateien, ich fand nur die Ausgabe von den Mappern.
Wenn ich versuche zu Debuggen, fand ich das gleiche problem mit dem word count Beispiel nach änderte ich die Kartografen Ausgang Wert-Typ aus Longwritable Text
package org.myorg;
import java.io.IOException;
import java.util.*;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.mapreduce.lib.input.*;
import org.apache.hadoop.mapreduce.lib.output.*;
import org.apache.hadoop.util.*;
public class WordCount extends Configured implements Tool {
public static class Map
extends Mapper<LongWritable, Text, Text, Text> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable key, Text wtf, Context context)
throws IOException, InterruptedException {
String line = wtf.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
context.write(word, new Text("frommapper"));
}
}
}
public static class Reduce
extends Reducer<Text, Text, Text, Text> {
public void reduce(Text key, Text wtfs,
Context context) throws IOException, InterruptedException {
/*
int sum = 0;
for (IntWritable val : wtfs) {
sum += val.get();
}
context.write(key, new IntWritable(sum));*/
context.write(key,new Text("can't output"));
}
}
public int run(String [] args) throws Exception {
Job job = new Job(getConf());
job.setJarByClass(WordCount.class);
job.setJobName("wordcount");
job.setOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
job.setOutputValueClass(Text.class);
job.setMapperClass(Map.class);
//job.setCombinerClass(Reduce.class);
job.setReducerClass(Reduce.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
FileInputFormat.setInputPaths(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
boolean success = job.waitForCompletion(true);
return success ? 0 : 1;
}
public static void main(String[] args) throws Exception {
int ret = ToolRunner.run(new WordCount(), args);
System.exit(ret);
}
}
hier sind die Ergebnisse
JobClient: Combine output records=0
12/06/13 17:37:46 INFO mapred.JobClient: Map input records=7
12/06/13 17:37:46 INFO mapred.JobClient: Reduce shuffle bytes=116
12/06/13 17:37:46 INFO mapred.JobClient: Reduce output records=7
12/06/13 17:37:46 INFO mapred.JobClient: Spilled Records=14
12/06/13 17:37:46 INFO mapred.JobClient: Map output bytes=96
12/06/13 17:37:46 INFO mapred.JobClient: Combine input records=0
12/06/13 17:37:46 INFO mapred.JobClient: Map output records=7
12/06/13 17:37:46 INFO mapred.JobClient: Reduce input records=7
dann fand ich die merkwürdigen Ergebnisse in die Ausgabedatei. Dieses problem passiert ist, nachdem ich verändert die Ausgabe Wert Art der Karte und die Eingabe-Taste, Art der Reduzierung auf Text egal, ich änderte die Art von reduzieren Ausgabe Wert ist oder nicht. Ich war auch gezwungen, die Arbeit zu ändern.setOutputValue(Text.class)
a frommapper
a frommapper
a frommapper
gg frommapper
h frommapper
sss frommapper
sss frommapper
Hilfe!
- Sollte die Unterschrift von der senken-Funktion so etwas wie: reduzieren(KEYIN key, Durchsuchbar<VALUEIN> Werte, Druckminderer.Kontext Kontext)? Sie haben nicht die Iterierbar<Text> Teil drin.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Reduzieren Ihre Funktion Argumente sollte wie folgt lauten:
Mit der Art und Weise, die Sie definiert haben, die Argumente reduzieren, die Bedienung ist nicht immer eine Liste von Werten, und daher ist es nur Ausgänge, was Eingang es wird von der map-Funktion, da
ist nur von 0 bis 1, jedes mal, weil jedes
<key, value>
paar in der form<word, one>
kommt separat an die reducer.Auch die mapper-Funktion nicht normal schreiben, um die Ausgabe-Datei ( ich habe noch nie davon gehört, aber ich weiß nicht, ob das überhaupt möglich ist). Im üblichen Fall ist es immer der reducer wird, schreibt die Ausgabe-Datei. Mapper output intermediate Daten, die transparent gehandhabt von Hadoop. Also, wenn Sie etwas sehen in der Ausgabe-Datei, die dann den reducer output, nicht der mapper-Ausgabe. Wenn Sie diese überprüfen möchten, können Sie gehen, um die Protokolle für den job, den Sie lief, und überprüfen Sie heraus, was passiert in den einzelnen mapper und reducer individuell.
Hoffe, das klärt einige Dinge für Sie.