2012-03-25 17 views
15

Qual è la differenza tra chiamare un lavoro di ridimensionamento di mappe da main() e da ToolRunner.run()? Quando diciamo che la classe principale dice, MapReduce extends Configured implements Tool, quali sono i privilegi aggiuntivi che otteniamo e che non abbiamo se dovessimo semplicemente eseguire il lavoro con il metodo principale? Grazie.Differenza nella chiamata del lavoro

risposta

23

Non c'è privilegi extra, ma le vostre opzioni da riga di comando GET gestita tramite il GenericOptionsParser, che vi permetterà di estrarre alcune proprietà di configurazione e configurare un oggetto di configurazione da esso:

http://hadoop.apache.org/common/docs/r0.20.2/api/org/apache/hadoop/util/GenericOptionsParser.html

In sostanza, piuttosto che l'analisi di alcuni opzioni di te (utilizzando l'indice dell'argomento nella lista), è possibile configurare in modo esplicito le proprietà di configurazione dalla riga di comando:

hadoop jar myJar.jar com.Main prop1value prop2value 

public static void main(String args[]) { 
    Configuration conf = new Configuration(); 
    conf.set("prop1", args[0]); 
    conf.set("prop2", args[1]); 

    conf.get("prop1"); // will resolve to "prop1Value" 
    conf.get("prop2"); // will resolve to "prop2Value" 
} 

diventa molto mor e condensata con ToolRunner:

hadoop jar myJar.jar com.Main -Dprop1=prop1value -Dprop2=prop2value 

public int run(String args[]) { 
    Configuration conf = getConf(); 

    conf.get("prop1"); // will resolve to "prop1Value" 
    conf.get("prop2"); // will resolve to "prop2Value" 
} 

Un'ultima parola di avvertimento, però: quando si utilizza il metodo di configurazione getconf(), creare l'oggetto di lavoro, poi tirare la sua configurazione fuori - il costruttore di lavoro fa una copia dell'oggetto Configruation passato in, quindi se si apporta modifiche al riferimento passata, è lavoro non vedrà questi cambiamenti:

public int run(String args[]) { 
    Configuration conf = getConf(); 

    conf.set("prop3", "blah"); 

    Job job = new Job(conf); // job will have a deep copy of conf 

    conf.set("prop4", "dummy"); // here we're amending the original conf 

    job.getConfiguration().get("prop4"); // will resolve to null 
} 
+0

Bene, questa era una buona spiegazione con il codice. Non ho notato alcuni punti prima come creare prima l'oggetto Job e poi ottenere la configurazione, ma ora ha senso .. –

11

utilizzando ToolRunner .run(), qualsiasi applicazione può gestire Hadoop standard command line options supportato da Hadoop. ToolRunner utilizza internamente GenericOptionsParser. In breve, le opzioni specifiche di hadoop fornite come riga di comando vengono analizzate e impostate nell'oggetto Configuration dell'applicazione. Se usi semplicemente main(), questo non avverrà automaticamente.

es. Se dici:

% hadoop MyHadoopApp -D mapred.reduce.tasks=3 

Poi ToolRunner.run(new MyHadoopApp(), args) imposta automaticamente il parametro value mapred.reduce.tasks-3 nell'oggetto Configuration.

Non ci sono privilegi aggiuntivi che otteniamo. In genere le persone non usano semplicemente main() nei lavori hadoop. L'utilizzo di ToolRunner .run() è una pratica standard.

+0

@ TejasP- Grazie infinite !! :) Sì, avevo un'idea così vaga in mente ma ora è chiara .. –

Problemi correlati