2011-07-11 9 views
8

Actualmente estoy tratando de averiguar cuándo se ejecuta un trabajo de MapReduce, lo que sucede al hacer algún system.out.println() en ciertos lugares del código, pero sé de los estados de impresión se imprime en mi terminal cuando se ejecuta el trabajo. ¿Puede alguien ayudarme a averiguar qué estoy haciendo exactamente mal aquí?MapReduce Trabajo que no muestra mis instrucciones de impresión en el 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; 
    } 
} 
} 

Respuesta

20

Esto depende de cómo se está presentando su trabajo, creo que vas a enviar usando bin/hadoop jar yourJar.jar ¿verdad?

Su System.out.println() solo está disponible en su método principal, porque el mapper/reductor se ejecuta dentro de hadoop en una JVM diferente, todas las salidas se redirigen a archivos de registro especiales (out/log-files). y se lo recomendaría a utilizar sus propios Apache-comunes de registro mediante:

Log log = LogFactory.getLog(YOUR_MAPPER_CLASS.class) 

y por lo tanto algo de información de registro:

log.info("Your message"); 

Si está en modo "locales", entonces se puede ver este registro en su shell, de lo contrario, este registro se almacenará en algún lugar de la máquina donde se ejecuta la tarea. Utilice la interfaz de usuario web de jobtracker para ver estos archivos de registro, es bastante conveniente. De forma predeterminada, el rastreador de trabajos se ejecuta en el puerto 50030.

+0

Menor modificación/sugerencia SLF4J parece más común hoy en día debido a la unión estática – jayunit100

+2

@ jayunit100 sí. Lo bueno de la tala de commons es que las jarras ya están allí porque Hadoop también las usa. Para SLF4J esto debe agregarse a través de libjars. –

1

Alternativamente, puede hacer uso de la clase MultipleOutputs y redirigir todos sus datos de registro en un archivo de salida (log).

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>); 
Cuestiones relacionadas