Implementación de la aplicación MapReduce

Implante una aplicación MapReduce.

  1. Cree src\main\java\org\apache\hadoop\examples\wordcount.java.
  2. Copie y pegue el siguiente código Java en el nuevo archivo.
    package org.apache.hadoop.examples;
     
    import java.io.IOException;
    import java.util.StringTokenizer;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Job;
    import org.apache.hadoop.mapreduce.Mapper;
    import org.apache.hadoop.mapreduce.Reducer;
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    import org.apache.hadoop.util.GenericOptionsParser;
     
    /**
     * Simple Word count application that defines Mapper and Reducer classes that counts the words in a give input file
     */
    public class WordCount {
     
        public static class TokenizerMapper
            extends Mapper<Object, Text, Text, IntWritable>{
     
        private final static IntWritable one = new IntWritable(1);
        private Text word = new Text();
     
        // map function is called for every line in the input file
        public void map(Object key, Text value, Context context
                        ) throws IOException, InterruptedException {
            StringTokenizer itr = new StringTokenizer(value.toString());
            while (itr.hasMoreTokens()) {
             word.set(itr.nextToken());
     
            // Update count as 1 for every word read from input line
             context.write(word, one);
            }
        }
    }
     
    public static class IntSumReducer
            extends Reducer<Text,IntWritable,Text,IntWritable> {
        private IntWritable result = new IntWritable();
     
       // reduce function is called with list of values sent by map function
        public void reduce(Text key, Iterable<IntWritable> values,
                            Context context) throws IOException, InterruptedException {
    
            // perform necessary aggregate operation and write result to the context
    
            int sum = 0;
            for (IntWritable val : values) {
              sum += val.get();
            }
            result.set(sum);
            context.write(key, result);
        }
    }
     
    /**
     * Driver code to provide the mapper & reducer function classes for Hadoop Map Reduce framework
     */
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
        if (otherArgs.length != 2) {
            System.err.println("Usage: wordcount <in> <out>");
            System.exit(2);
        }
        Job job = new Job(conf, "word count");
        job.setJarByClass(WordCount.class);
        job.setMapperClass(TokenizerMapper.class);
        job.setCombinerClass(IntSumReducer.class);
        job.setReducerClass(IntSumReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
        FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
        }
    }
  3. Cierre el archivo.

Creación del JAR de Aplicación

Ejecute mvn clean package desde la carpeta raíz del proyecto para crear el JAR de la aplicación en la carpeta de destino. Por ejemplo, wordcountjava-1.0-SNAPSHOT.jar.

mvn clean package

Este comando limpia cualquier artefacto de compilación anterior, descarga cualquier dependencia que aún no se haya instalado y, a continuación, crea y empaqueta la aplicación.

Una vez finalizado el comando, el directorio wordcountjava/target contiene un archivo denominado wordcountjava-1.0-SNAPSHOT.jar.

Nota

El archivo wordcountjava-1.0-SNAPSHOT.jar es un uberjar, que contiene no solo el trabajo WordCount, sino también las dependencias que necesita el trabajo en tiempo de ejecución.

Ejecución del archivo JAR de la aplicación MapReduce

Copie el JAR en cualquier nodo. Por ejemplo:

- yarn jar /tmp/wordcountjava-1.0-SNAPSHOT.jar org.apache.hadoop.examples.WordCount /example/data/input.txt /example/data/wordcountout

Parámetros:

  • /example/data/input.txt: ruta de acceso de HDFS para el archivo de texto de entrada
  • /example/data/wordcountout: ruta de HDFS para el resultado (salida del reductor)

Salida de ejemplo:

 >> hdfs dfs -cat /example/data/wordcountout/* 

          zeal    1
          zelus   1
          zenith  2
Nota

El archivo wordcountjava-1.0-SNAPSHOT.jar es un JAR gordo si se crea a través de maven-shade-plugin. También puede utilizar -libjars como opción para proporcionar JAR adicionales a la ruta de acceso de clase de trabajo. En un cluster seguro, se necesitan kinit y las políticas de Ranger adecuadas antes de ejecutar el trabajo.