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
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
}
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.
@ TejasP- Grazie infinite !! :) Sì, avevo un'idea così vaga in mente ma ora è chiara .. –
- 1. Problema nella creazione del lavoro del timer
- 2. Lavoro spark con chiamata HTTP Async
- 3. Protezione del thread principale dagli errori nella thread di lavoro
- 4. Differenza tra lavoro Jenkins e progetto
- 5. Chiamata Ajax del dominio incrociato nella shell Atom
- 6. Differenza tra chiamata per riferimento e la chiamata per valore
- 7. Differenza tra ISR e chiamata di funzione?
- 8. JavaQuartz Persistenza del lavoro
- 9. Lavoro ritardato: come ricaricare le classi del payload durante ogni chiamata in modalità di sviluppo
- 10. Utilizzare ** kwargs sia nella chiamata che nella definizione della funzione
- 11. "Argomento mancante per il parametro" stile "nella chiamata" errore nella creazione del sistema UIBarButtonItem
- 12. Flusso di lavoro CRM2011: cosa succede se il campo utilizzato nella condizione del flusso di lavoro viene aggiornato dopo l'avvio del flusso di lavoro?
- 13. Swift: argomento aggiuntivo 'errore' nella chiamata
- 14. Attività del flusso di lavoro personalizzato non visualizzata nella registrazione del plugin
- 15. La query ElasticSearch si blocca nella coda di lavoro laravel
- 16. Chiamata a malloc fallendo nella sessione gdb
- 17. android - chiamata il thread ui dal thread di lavoro
- 18. Festa del lavoro vs. Ringraziamento
- 19. Daemon del servizio lavoro Python?
- 20. Chiamata ricorsiva nella classe Javascript (requestanimationframe)
- 21. "usato come valore" nella chiamata di funzione
- 22. Configurare la directory di lavoro del foglio di lavoro Scala
- 23. Quartz.net ripetere il lavoro all'intervallo dopo il completamento del lavoro
- 24. Come posso sapere per quanto tempo un lavoro di Jenkins è stato nella coda di attesa al termine del lavoro?
- 25. Come funziona l'OPTIND lavoro variabile nella shell incorporato getopts
- 26. Qual è la differenza tra chiamata di sistema e chiamata di libreria?
- 27. Gerarchia di chiamata del costruttore
- 28. Inseguimento "ORA-01084: argomento non valido nella chiamata OCI"
- 29. L'attuale lavoratore partecipa al furto del lavoro?
- 30. Differenza di tempo nella funzione di rincorsa (senso) in Yampa
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 .. –