2011-07-11 1 views
8

J'essaie actuellement de comprendre quand vous exécutez un travail MapReduce ce qui se passe en faisant un certain system.out.println() à certains endroits sur le code mais connaissez ces instructions print arrive à imprimer sur mon terminal lorsque le travail s'exécute. Quelqu'un peut-il m'aider à comprendre ce que je fais mal ici.MapReduce Le travail ne montre pas mes instructions d'impression sur le terminal

import java.io.IOException; 
import java.util.StringTokenizer; 
import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.InputSplit; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.mapreduce.Mapper; 
import org.apache.hadoop.mapreduce.OutputCommitter; 
import org.apache.hadoop.mapreduce.RecordReader; 
import org.apache.hadoop.mapreduce.RecordWriter; 
import org.apache.hadoop.mapreduce.Reducer; 
import org.apache.hadoop.mapreduce.StatusReporter; 
import org.apache.hadoop.mapreduce.TaskAttemptID; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 

public class WordCountJob { 
    public static int iterations; 
    public static class TokenizerMapper 
    extends Mapper<Object, Text, Text, IntWritable>{ 

private final static IntWritable one = new IntWritable(1); 
private Text word = new Text(); 
@Override 
public void map(Object key, Text value, Context context 
       ) throws IOException, InterruptedException { 
    System.out.println("blalblbfbbfbbbgghghghghghgh"); 
    StringTokenizer itr = new StringTokenizer(value.toString()); 
    while (itr.hasMoreTokens()) { 
    word.set(itr.nextToken()); 
    String myWord = itr.nextToken(); 
    int n = 0; 
    while(n< 5){ 
     myWord = myWord+ "Test my appending words"; 
     n++; 
    } 
    System.out.println("Print my word: "+myWord); 
    word.set(myWord); 
    context.write(word, one); 
    } 
} 
} 

public static class IntSumReducer 
    extends Reducer<Text,IntWritable,Text,IntWritable> { 
private IntWritable result = new IntWritable(); 

public void reduce(Text key, Iterable<IntWritable> values, 
        Context context 
        ) throws IOException, InterruptedException { 
    int sum = 0; 
    for (IntWritable val : values) { 
    sum += val.get(); 
    } 
    result.set(sum); 
    context.write(key, result); 
    } 
} 

public static void main(String[] args) throws Exception { 
Configuration conf = new Configuration(); 
TaskAttemptID taskid = new TaskAttemptID(); 
TokenizerMapper my = new TokenizerMapper(); 

if (args.length != 3) { 
    System.err.println("Usage: WordCountJob <in> <out> <iterations>"); 
    System.exit(2); 
} 
iterations = new Integer(args[2]); 
Path inPath = new Path(args[0]); 
Path outPath = null; 
for (int i = 0; i<iterations; ++i){ 
    System.out.println("Iteration number: "+i); 
    outPath = new Path(args[1]+i); 
    Job job = new Job(conf, "WordCountJob"); 
    job.setJarByClass(WordCountJob.class); 
    job.setMapperClass(TokenizerMapper.class); 
    job.setCombinerClass(IntSumReducer.class); 
    job.setReducerClass(IntSumReducer.class); 
    job.setOutputKeyClass(Text.class); 
    job.setOutputValueClass(IntWritable.class); 
    FileInputFormat.addInputPath(job, inPath); 
    FileOutputFormat.setOutputPath(job, outPath); 
    job.waitForCompletion(true); 
    inPath = outPath; 
    } 
} 
} 

Répondre

20

Cela dépend de la façon dont vous présentez votre travail, je pense que vous soumettez à l'aide bin/hadoop jar yourJar.jar droit? Votre System.out.println() est seulement disponible dans votre méthode principale, parce que le mapper/réducteur est exécuté à l'intérieur de hadoop dans une JVM différente, toutes les sorties sont redirigées vers des fichiers journaux spéciaux (out/log-files). Je recommande d'utiliser vos propres Apache Commons journal à l'aide:

Log log = LogFactory.getLog(YOUR_MAPPER_CLASS.class) 

Et donc faire une exploitation forestière info:

log.info("Your message"); 

Si vous êtes dans -mode « local » alors vous pouvez voir ce journal dans votre shell, sinon ce journal sera stocké quelque part sur la machine où la tâche est exécutée. S'il vous plaît utiliser l'interface web du jobtracker pour regarder ces fichiers journaux, c'est très pratique. Par défaut, le traqueur de travaux s'exécute sur le port 50030.

+0

modification mineure/suggestion SLF4J semble plus fréquent de nos jours en raison de la liaison statique – jayunit100

+2

@ jayunit100 oui. Ce qui est cool à propos de la journalisation des communs, c'est que les pots sont déjà là parce qu'Hadoop l'utilise aussi. Pour SLF4J, ceci doit être ajouté via libjars. –

1

Vous pouvez également utiliser la classe MultipleOutputs et rediriger toutes vos données de journal dans un fichier de sortie (journal).

MultipleOutputs<Text, Text> mos = new MultipleOutputs<Text, Text>(context); 
Text tKey = new Text("key"); 
Text tVal = new Text("log message"); 
mos.write(tKey, tVal, <lOG_FILE>); 
Questions connexes