tutorial - mapreduce java example
Preguntas de implementaciĆ³n de Hadoop MapReduce, Java (1)
Aquí están tus respuestas.
Las clases de correlacionador y reductor pueden estar en clases Java separadas, en cualquier lugar de la estructura del paquete o pueden separar archivos jar siempre que el cargador de clases de MapTask / ReduceTask pueda cargar las clases mapper / reduccer. El ejemplo que muestra es para una prueba rápida para los principiantes de Hadoop.
Sí, puedes usar cualquier biblioteca de Java. Estos
-files
hadoop jar
terceros deben estar disponibles para MapTask / ReduceTask a través de la opciónhadoop jar
comandohadoop jar
o del uso de Hadoop API. Mire este enlace aquí Para obtener más información sobre cómo agregar bibliotecas de terceros a Map / Reduce classpathSí, puede configurar y pasar las configuraciones al Mapa / Reducir trabajos usando cualquiera de estos enfoques.
3.1 Utilice el objeto
org.apache.hadoop.conf.Configuration
como se indica a continuación para configurar las configuraciones en el programa cliente (la clase Java con el métodomain()
Configuration conf = new Configuration(); conf.set("config1", "value1"); Job job = new Job(conf, "Whole File input");
Los programas Map / Reduce tienen acceso al objeto Configuration y obtienen los valores establecidos para las propiedades usando el método get()
. Este enfoque es recomendable si la configuración de configuración es pequeña.
3.2 Utilice la memoria caché distribuida para cargar las configuraciones y ponerla a disposición en los programas Mapa / Reducir. Haga clic aquí para obtener más información sobre la memoria caché distribuida. Este enfoque es más recomendable.
4.The main()
es el programa cliente que debe ser responsable de configurar y enviar el trabajo de Hadoop. Si no se establece ninguna de las configuraciones, entonces se usará la configuración predeterminada. Las configuraciones tales como clase de Mapper, clase de reductor, ruta de entrada, ruta de salida, clase de formato de entrada, número de reductores, etc. Por ejemplo:
Además, mira la documentación aquí en la configuración del trabajo
Sí, los programas de Mapa / Reducción siguen siendo un programa de JavaSE, sin embargo, estos están distribuidos en todas las máquinas del clúster de Hadoop. Digamos que el clúster Hadoop tiene 100 nodos y envió el ejemplo del recuento de palabras. El marco Hadoop crea el proceso Java para cada una de estas tareas de Asignar y Reducir y llama a los métodos de devolución de llamada como map()/reduce()
en el subconjunto de máquinas donde existen los datos. Esencialmente, el código de su mapper / reducer se ejecuta en la máquina donde existen los datos. Te recomendaría que leyeras el Capítulo 6 de The Definitive Guide
Espero que esto ayude.
Actualmente estoy en Apache Hadoop (con la implementación de Java de los trabajos de MapReduce). Busqué algunos ejemplos (como el ejemplo de WordCount). Tengo éxito jugando con la escritura de aplicaciones de mapreduce personalizadas (estoy usando Cloudera Hadoop Demo VM). Mi pregunta es acerca de algunas preguntas de implementación y tiempo de ejecución.
El prototipo de la clase de trabajo es el siguiente:
public class WordCount {
public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> {
public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
// mapping
}
}
}
public static class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
// reducing
}
}
public static void main(String[] args) throws Exception {
JobConf conf = new JobConf(WordCount.class);
conf.setJobName("wordcount");
// setting map and reduce classes, and various configs
JobClient.runJob(conf);
}
}
Tengo algunas preguntas, intenté googlearlas, pero debo decir que la documentación sobre hadoop es muy formal (como un gran libro de referencia), no adecuada para principiantes.
Mis preguntas:
- ¿Las clases de Mapa y Reducción tienen que ser clases internas estáticas en la clase Principal, o pueden estar en cualquier lugar (solo visibles desde Main?)
- ¿Puedes usar todo lo que Java SE y las bibliotecas disponibles tienen para ofrecer, como en una aplicación Java SE normal? Quiero decir, como JAXB, Guava, Jackson para JSON, etc.
- ¿Cuál es la mejor práctica para escribir soluciones genéricas? Quiero decir: queremos procesar grandes cantidades de archivos de registro de maneras diferentes (pero ligeramente similares). El último token del archivo de registro es siempre un mapa JSON con algunas entradas. Un procesamiento podría ser: contar y agrupar por las filas de registro activadas (keyA, keyB del mapa), y otro podría ser: contar y agrupar por las filas de registro activadas (keyX, keyY del mapa). (Estoy pensando en alguna solución basada en archivos de configuración, donde puede proporcionar las entradas realmente necesarias para el programa; si necesita una nueva resolución, solo tiene que proporcionar la configuración y ejecutar la aplicación).
- puede ser relevante: en el ejemplo de WordCount las clases Map y Reduce son clases internas estáticas y main () no tiene ninguna influencia sobre ellas, solo proporciona estas clases al framework. Puede hacer estas clases no estáticas, proporcionar algunos campos y un constructor para modificar el tiempo de ejecución con algunos valores actuales (como los parámetros de configuración que mencioné).
Tal vez estoy investigando los detalles innecesariamente. La pregunta general es: ¿sigue siendo un programa hadoop mapreduce una aplicación JavaSE normal a la que estamos acostumbrados?