Création d'InputFormat personnalisé

Le but de ce TP est de créer un InputFormat peronnalisé dans le framework Map Reduce de 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/$

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: Point2DWritbale

Ecrivez un nouveau type de Valeur nommé Point2DWritbale qui permet de manipuler un Point2D.Double de java.

Exercie 2: RandomPointInputFormat

Ecrivez un nouveau format d'entrée de hadoop qui permet de générer des points aléatoires. Pour cela:

  • Vous écrirez une nouvelle classe RandomPointInputFormat qui hérite de InputFormat.
  • Vous écrirez une nouvelle classe FakeInputSplit qui hérite de InputSplit et qui représentera vos blocs virtuels de points aléatoires.
  • Vous écrirez une nouvelle classe RandomPointReader qui génère à la volée vos points aléatoires pour chaque FakeInputSplit.

Exercice 3: Test du RandomPointInputFormat

Ecrivez un programme map/reduce qui utilise votre InputFormat en entrée et qui enregistre les points générés dans un fichier texte. Vous devez pouvoir passer en paramètre le nombre de mappeur (splits générés) et le nombre de points générés dans chaque splits.

Exercice 4: Calcul de PI

Utilisez votre input format pour calculer la valeur de PI en utilisant la méthode de Monte carlo. Vous trouverez une explication de la méthode sur cette page.