Requisitos previos: Hadoop y MapReduce
Contar la cantidad de palabras en cualquier idioma es pan comido como en C, C++, Python, Java, etc. MapReduce también usa Java, pero es muy fácil si conoce la sintaxis sobre cómo escribirlo. Es el básico de MapReduce. Primero aprenderá cómo ejecutar este código similar al programa «Hello World» en otros idiomas. Aquí están los pasos que muestran cómo escribir un código MapReduce para Word Count.
Ejemplo:
Entrada:
Hello I am GeeksforGeeks Hello I am an Intern
Producción:
GeeksforGeeks 1 Hello 2 I 2 Intern 1 am 2 an 1
Pasos:
- Primero abra Eclipse -> luego seleccione Archivo -> Nuevo -> Proyecto Java -> Nómbrelo WordCount -> luego Finalizar .
- Cree tres clases de Java en el proyecto. Nómbrelos WCDriver (que tiene la función principal), WCMapper , WCReducer .
- Debe incluir dos bibliotecas de referencia para eso:
haga clic con el botón derecho en Proyecto -> luego seleccione Ruta de compilación -> Haga clic en Configurar ruta de compilación
- En la figura anterior, puede ver la opción Agregar JAR externos en el lado derecho. Haga clic en él y agregue los archivos de mención a continuación. Puede encontrar estos archivos en /usr/lib/
1. /usr/lib/hadoop-0.20-mapreduce/hadoop-core-2.6.0-mr1-cdh5.13.0.jar
2. /usr/lib/hadoop/hadoop- común-2.6.0-cdh5.13.0.jar
Código Mapper: Tienes que copiar y pegar este programa en el archivo WCMapper Java Class.
Java
// Importing libraries import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapred.MapReduceBase; import org.apache.hadoop.mapred.Mapper; import org.apache.hadoop.mapred.OutputCollector; import org.apache.hadoop.mapred.Reporter; public class WCMapper extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> { // Map function public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter rep) throws IOException { String line = value.toString(); // Splitting the line on spaces for (String word : line.split(" ")) { if (word.length() > 0) { output.collect(new Text(word), new IntWritable(1)); } } } }
Código reductor: debe copiar y pegar este programa en el archivo WCReducer Java Class.
Java
// Importing libraries import java.io.IOException; import java.util.Iterator; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapred.MapReduceBase; import org.apache.hadoop.mapred.OutputCollector; import org.apache.hadoop.mapred.Reducer; import org.apache.hadoop.mapred.Reporter; public class WCReducer extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> { // Reduce function public void reduce(Text key, Iterator<IntWritable> value, OutputCollector<Text, IntWritable> output, Reporter rep) throws IOException { int count = 0; // Counting the frequency of each words while (value.hasNext()) { IntWritable i = value.next(); count += i.get(); } output.collect(key, new IntWritable(count)); } }
Código del controlador: debe copiar y pegar este programa en el archivo WCDriver Java Class.
Java
// Importing libraries import java.io.IOException; import org.apache.hadoop.conf.Configured; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapred.FileInputFormat; import org.apache.hadoop.mapred.FileOutputFormat; import org.apache.hadoop.mapred.JobClient; import org.apache.hadoop.mapred.JobConf; import org.apache.hadoop.util.Tool; import org.apache.hadoop.util.ToolRunner; public class WCDriver extends Configured implements Tool { public int run(String args[]) throws IOException { if (args.length < 2) { System.out.println("Please give valid inputs"); return -1; } JobConf conf = new JobConf(WCDriver.class); FileInputFormat.setInputPaths(conf, new Path(args[0])); FileOutputFormat.setOutputPath(conf, new Path(args[1])); conf.setMapperClass(WCMapper.class); conf.setReducerClass(WCReducer.class); conf.setMapOutputKeyClass(Text.class); conf.setMapOutputValueClass(IntWritable.class); conf.setOutputKeyClass(Text.class); conf.setOutputValueClass(IntWritable.class); JobClient.runJob(conf); return 0; } // Main Method public static void main(String args[]) throws Exception { int exitCode = ToolRunner.run(new WCDriver(), args); System.out.println(exitCode); } }
- Ahora tienes que hacer un archivo jar. Haga clic con el botón derecho en Proyecto -> Haga clic en Exportar -> Seleccione el destino de exportación como Archivo Jar -> Asigne un nombre al archivo jar (WordCount.jar) -> Haga clic en Siguiente -> por último , haga clic en Finalizar . Ahora copie este archivo en el directorio Workspace de Cloudera
- Abra la terminal en CDH y cambie el directorio al espacio de trabajo. Puede hacer esto usando el comando «cd workspace/». Ahora, cree un archivo de texto ( WCFile.txt ) y muévalo a HDFS. Para ese terminal abierto y escriba este código (recuerde que debe estar en el mismo directorio que el archivo jar que acaba de crear).
- Ahora, ejecute este comando para copiar el archivo de entrada del archivo en el HDFS.
hadoop fs -put WCFile.txt WCFile.txt
- Ahora para ejecutar el archivo jar escribiendo el código como se muestra en la captura de pantalla.
- Después de ejecutar el código, puede ver el resultado en el archivo WCOutput o escribiendo el siguiente comando en la terminal.
hadoop fs -cat WCOutput/part-00000
Publicación traducida automáticamente
Artículo escrito por Ankit_Bisht y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA