2012-09-25 11 views
6

Voglio acces il valore myCounter.my in riduttore:come accedere al valore del contatore del mapper in un riduttore?

public static class Map extends Mapper<LongWritable, Text, ImmutableBytesWritable, ImmutableBytesWritable> 
{ 
    public static enum myCounter{my}; 

    @Override 
    public void map(LongWritable key, Text value, Context context) 
    { 
     context.getCounter(myCounter.my).increment(1); 
     context.write(new ImmutableBytesWritable (),new ImmutableBytesWritable()); 
    } 
} 


public static class Reduce extends Reducer<ImmutableBytesWritable, ImmutableBytesWritable, Text, Text> 
{ 
    @Override 
    public void reduce(ImmutableBytesWritable key,Iterable<ImmutableBytesWritable> result,Context context) 
    { 

    } 
} 

Accessing a mapper's counter from a reducer(for old API is given) come farlo funzionare per nuova API?

O

Voglio sapere il numero totale di uscita mapper? C'è un modo migliore? (Io non sono in grado di accedere contatore in Reducer:

Group Name->org.apache.hadoop.mapred.Task$Counter Counter Name->MAP_OUTPUT_RECORDS)

Grazie

+0

quale versione di hadoop stai usando? – faizan

+0

Hadoop 0.20.0 API –

+0

@faizan: Hadoop 0.20.0 API –

risposta

-2

È possibile accedere come segue:

Map.myCounter.my // static fields you can access by it's class name. 
+0

In hadoop Map-Reduce framework non funziona così. La mia domanda è specifica per Map_reduce Framework. –

0

Puoi accedere al tuo valore del contatore nel riduttore utilizzando lo stesso codice

Counter counter = context.getCounter(myCounter.my); 
     counter.getValue(); 

also see

+0

Its Not working .counter.getValue restituirà zero poiché il contesto (org.apache.hadoop.mapreduce.Reducer.Context ) in Reducer è diverso dal contesto (org.apache.hadoop .mapreduce.Reducer.Context ) di Mapper. –

+0

per quanto ne so il contesto ti dà accesso allo stesso contatore globale. – faizan

+0

quindi non ha alcun effetto se si sta accedendo al contesto dall'impostazione o dalla mappa o si riduce il metodo [collegamento] (http://diveintodata.org/2011/03/15/an-example-of-hadoop-mapreduce-counter/) – faizan

1

È possibile farlo funzionare per nuove API accedendo ai contatori tramite oggetto lavoro.

Configuration conf = context.getConfiguration(); 
Cluster cluster = new Cluster(conf); 
Job currentJob = cluster.getJob(context.getJobID()); 
long val=currentJob.getCounters().findCounter(myCounter.my).getValue(); 
+0

Ha funzionato per me. Grazie – Ajaykumar

Problemi correlati