Implémentation de l'application MapReduce

Implémentez une application MapReduce.

  1. Créez src\main\java\org\apache\hadoop\examples\wordcount.java.
  2. Copiez et collez le code Java suivant dans le nouveau fichier.
    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. Fermez le fichier.

Créer le fichier JAR d'application

Exécutez mvn clean package à partir du dossier racine du projet pour créer un fichier JAR d'application dans le dossier cible. Par exemple, wordcountjava-1.0-SNAPSHOT.jar.

mvn clean package

Cette commande nettoie les artefacts de build précédents, télécharge les dépendances qui n'ont pas encore été installées, puis génère et package l'application.

Une fois la commande terminée, le répertoire wordcountjava/target contient un fichier nommé wordcountjava-1.0-SNAPSHOT.jar.

Remarque

Le fichier wordcountjava-1.0-SNAPSHOT.jar est un fichier uberjar, qui contient non seulement le travail WordCount, mais également les dépendances requises par le travail lors de l'exécution.

Exécution du fichier JAR d'application MapReduce

Copiez le fichier JAR sur n'importe quel noeud. Par exemple :

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

Paramètres :

  • /example/data/input.txt : chemin HDFS du fichier texte d'entrée
  • /example/data/wordcountout : chemin HDFS pour le résultat (sortie du réducteur)

Exemple de sortie :

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

          zeal    1
          zelus   1
          zenith  2
Remarque

Le fichier wordcountjava-1.0-SNAPSHOT.jar est un fichier FAT JAR s'il est créé via maven-shade-plugin. Vous pouvez également utiliser -libjars en tant qu'option pour fournir des fichiers JAR supplémentaires au chemin de classe de travail. Dans un cluster sécurisé, les stratégies kinit et Ranger appropriées sont requises avant de soumettre le travail.