Premiers pas avec Hadoop MapReduce 1/2

Le but de ce TP est de se familiariser avec le framework Map Reduce implémenté dans l'écosystème Hadoop. Pour ce TP on considère que nous disposons d'un serveur Hadoop YARN. On installera (si-nécessaire) uniquement les outils permettant de communiquer avec ce serveur YARN (Hadoop ressource manager). Addresse des services du cluster:

  • Namenode (HDFS): $hdfs://10.0.NUM_SALLE.3:9000/$
  • Ressource manager (YARN): $10.0.NUM_SALLE.3:$
  • WebUI (HDFS): $http://10.0.NUM_SALLE.3:50070/$
  • WebUI (YARN): $http://10.0.NUM_SALLE.3:8088/$

Partie 1: Test du client YARN}}

  • Lancez un navigateur et connectez vous à l'adresse 10.0.NUM_SALLE.3:8088. Vous devez arriver sur l'interface web du serveur YARN.
  • Regardez les fonctionnalités qu'offre l'interface Web.
  • Lancez la commande:

    ̀ yarn jar /espace/NAME-cluster1/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-X.X.X.jar̀

  • Essayez le programme pi avec les paramètres 32 et 32, regardez sur l'interface web ce qui se passe.

  • Regardez les résultats affichés sur la sortie standard

Partie 2: Premiers programmes Map Reduce

RAPPEL : Squelette minimal d'une application Map Reduce

import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritbale;
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.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextOutputFormat;

public class MonProg {
  public static class MonProgMapper
       extends Mapper<LongWritable, Text, Text, IntWritable>{
      public void map(Object key, Text value, Context context
              ) throws IOException, InterruptedException {
          //context.write(word, one);
      }
  }
  public static class MonProgReducer
       extends Reducer<Text,IntWritable,Text,IntWritable> {
    public void reduce(Text key, Iterable<IntWritable> values,
                       Context context
                       ) throws IOException, InterruptedException {
      //context.write(key, result);
    }
  }
  public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    Job job = Job.getInstance(conf, "MonProg");
    job.setNumReduceTasks(1);
    job.setJarByClass(MonProg.class);
    job.setMapperClass(MonProgMapper.class);
    job.setMapOutputKeyClass(Text.class);
    job.setMapOutputValueClass(IntWritable.class);
    job.setReducerClass(MonProgReducer.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
    job.setOutputFormatClass(TextOutputFormat.class);
    job.setInputFormatClass(TextInputFormat.class);
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    System.exit(job.waitForCompletion(true) ? 0 : 1);
  }
}

Archive du projet maven : mapreduce_maven.tgz

Compilation

Compiler avec Maven : mvn compile

Générer le jar sans Maven :

cd mapreduce_maven/target/classes
jar cf tp3.jar *.class

Attention, pensez bien à spécifier la main class lors de l'appel à yarn dans ce cas.

Générer le jar avec Maven : mvn package

Attention, pensez il ne faut pas spécifier la main class lors de l'appel à yarn dans ce cas. Car la main est déjà spécifiée dans le "manifest"

Exercie 1: Filtrage

Dans le répertoire /user/raw_data de HDFS, vous trouverez un fichier nommé worldcitiespop.txt de taille 144MB. Ce fichier contient la liste des villes de la planète, leur géolocalisation, leur code région et leur population.

  • Utilisez la commande hdfs tail pour regarder la structure de notre fichier de population.
  • Ecrivez un premier programme map reduce qui lit ce fichier et qui enlève toutes les lignes dont la population n'est pas connue. Pour lancer votre programme utilisez la commande: yarn jar votrejar InputURI OutPutURI
  • Utilisez la commande hdfs cat pour compter le nombre de lignes du fichier généré par votre reducer.

Information: Le résultat de chaque reducer est enregistré dans un fichier nommé part-r-XXXXX et situé dans le répertoire spécifié par setOutputPath.

Attention: La première ligne du fichier est différente des autres.

Exercice 2: Compteurs

Dans la documentation de l'API Hadoop, lisez la documentation des classes/interfaces suivantes:

  • org.apache.hadoop.mapreduce.Mapper
  • org.apache.hadoop.mapreduce.MapContext
  • org.apache.hadoop.mapreduce.Reducer
  • org.apache.hadoop.mapreduce.Counter

Attention: Ne confondez pas le package mapred (qui est obsolète) et le package mapreduce.

En utilisant la fonction getCounter(String, String) de vos Mapper ajouter dans le programme de l'exercice 1 trois compteurs qui comptent respectivement, le nombre de villes valide; le nombre de villes avec une population renseignée et le nombre d'habitants de toutes les villes. Vos trois compteurs seront ajouter dans le groupe "WCP" et s'appelleront respectivement "nb_cities", "nb_pop", "total_pop".