2012-03-25 27 views
15

¿cuál es la diferencia entre llamar a un trabajo de mapreduce desde main() y desde ToolRunner.run()? Cuando decimos que la clase principal dice, MapReduce extends Configured implements Tool, ¿cuáles son los privilegios adicionales que obtenemos que no tenemos si simplemente hiciéramos una simple ejecución del trabajo desde el método principal? Gracias.Diferencia al llamar al trabajo

Respuesta

23

No hay privilegios adicionales, pero sus opciones de línea de comando Get corren a través de la GenericOptionsParser, lo que permitirá extraer ciertas propiedades de configuración y configurar un objeto de configuración de él:

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

Básicamente bien que analizar algunos opciones de unidad (utilizando el índice del argumento en la lista), puede configurar explícitamente las propiedades de configuración desde la línea de comandos:

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" 
} 

vuelve mucho mor e condensa 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" 
} 

Una última palabra de advertencia: cuando se utiliza el método de configuración getconf(), crear su objeto de trabajo en primer lugar, a continuación, tire su configuración fuera - el constructor de empleo hace una copia del objeto Configruation aprobada en, por lo que si hace cambios a la referencia en el pasado, que el trabajo no verá esos cambios:

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

Bueno, esa fue una buena explicación con el código. No noté algunos puntos antes, como crear primero el objeto Job y luego obtener la configuración, pero ahora tiene sentido ... –

11

mediante el uso de ToolRunner .run(), cualquier aplicación puede manejar hadoop standard command line options apoyo de Hadoop. ToolRunner usa GenericOptionsParser internamente. En resumen, las opciones específicas de hadoop que se proporcionan con la línea de comandos se analizan y se establecen en el objeto Configuration de la aplicación. Si simplemente usa main(), esto no sucederá automáticamente.

por ejemplo. Si usted dice:

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

Entonces ToolRunner.run(new MyHadoopApp(), args) establecerá automáticamente el parámetro de valor mapred.reduce.tasks a 3 en el objeto Configuration.

No tenemos privilegios adicionales que podamos obtener. Normalmente, las personas no usan simplemente main() en trabajos de hadoop. Usar ToolRunner .run() es una práctica estándar.

+0

@ TejasP- Thanx much !! :) Sí, tenía en mente una idea tan vaga, pero ahora está clara ... –

Cuestiones relacionadas