Fusion de données sur les dinosaures avec Hadoop

HadoopHadoopBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans l'époque des dinosaures, un chasseur de dinosaures intrépide nommé Alex entreprend une mission passionnante pour découvrir les secrets de ces créatures préhistoriques. Le but d'Alex est de rassembler des données précieuses à partir de diverses sources et de réaliser des analyses avancées pour mieux comprendre le comportement, l'alimentation et l'évolution des différentes espèces de dinosaures.

Pour y parvenir, Alex doit exploiter le pouvoir de Hadoop MapReduce et sa capacité à effectuer efficacement des opérations de jointure. En combinant des données provenant de multiples sources, Alex peut combiner des informations sur les fossiles de dinosaures, leur emplacement géologique et les conditions environnementales pour avoir une vision globale du monde des dinosaures.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL hadoop(("Hadoop")) -.-> hadoop/HadoopMapReduceGroup(["Hadoop MapReduce"]) hadoop(("Hadoop")) -.-> hadoop/HadoopHiveGroup(["Hadoop Hive"]) hadoop(("Hadoop")) -.-> hadoop/HadoopHDFSGroup(["Hadoop HDFS"]) hadoop/HadoopHDFSGroup -.-> hadoop/hdfs_setup("HDFS Setup") hadoop/HadoopHDFSGroup -.-> hadoop/fs_cat("FS Shell cat") hadoop/HadoopHDFSGroup -.-> hadoop/fs_ls("FS Shell ls") hadoop/HadoopHDFSGroup -.-> hadoop/fs_mkdir("FS Shell mkdir") hadoop/HadoopHDFSGroup -.-> hadoop/fs_put("FS Shell copyToLocal/put") hadoop/HadoopMapReduceGroup -.-> hadoop/mappers_reducers("Coding Mappers and Reducers") hadoop/HadoopMapReduceGroup -.-> hadoop/implement_join("Implementing Join Operation") hadoop/HadoopHiveGroup -.-> hadoop/import_export_data("Importing and Exporting Data") hadoop/HadoopHiveGroup -.-> hadoop/join("join Usage") subgraph Lab Skills hadoop/hdfs_setup -.-> lab-288979{{"Fusion de données sur les dinosaures avec Hadoop"}} hadoop/fs_cat -.-> lab-288979{{"Fusion de données sur les dinosaures avec Hadoop"}} hadoop/fs_ls -.-> lab-288979{{"Fusion de données sur les dinosaures avec Hadoop"}} hadoop/fs_mkdir -.-> lab-288979{{"Fusion de données sur les dinosaures avec Hadoop"}} hadoop/fs_put -.-> lab-288979{{"Fusion de données sur les dinosaures avec Hadoop"}} hadoop/mappers_reducers -.-> lab-288979{{"Fusion de données sur les dinosaures avec Hadoop"}} hadoop/implement_join -.-> lab-288979{{"Fusion de données sur les dinosaures avec Hadoop"}} hadoop/import_export_data -.-> lab-288979{{"Fusion de données sur les dinosaures avec Hadoop"}} hadoop/join -.-> lab-288979{{"Fusion de données sur les dinosaures avec Hadoop"}} end

Configurez l'environnement et les données

Dans cette étape, nous allons configurer l'environnement nécessaire et préparer les données pour l'opération de jointure.

Tout d'abord, changez d'utilisateur en hadoop puis accédez au répertoire personnel de l'utilisateur hadoop :

su - hadoop

Créez un nouveau répertoire appelé join-lab pour stocker nos fichiers :

mkdir join-lab
cd join-lab

Ensuite, créons deux fichiers de données : dinosaurs.txt et locations.txt. Ces fichiers contiendront respectivement des informations sur les dinosaures et leurs emplacements de fossiles.

Créez dinosaurs.txt avec le contenu suivant :

trex,Tyrannosaurus Rex,carnivore
velociraptor,Velociraptor,carnivore
brachiosaurus,Brachiosaurus,herbivore
stegosaurus,Stegosaurus,herbivore

Créez locations.txt avec le contenu suivant :

trex,North America
velociraptor,Asia
brachiosaurus,Africa
stegosaurus,North America

Enfin, chargez join-lab sur hdfs à l'aide de la commande suivante :

hadoop fs -mkdir -p /home/hadoop
hadoop fs -put /home/hadoop/join-lab /home/hadoop/

Implémentez l'opération de jointure

Dans cette étape, nous allons implémenter un travail MapReduce pour effectuer une opération de jointure sur les fichiers dinosaurs.txt et locations.txt.

Créez un nouveau fichier Java nommé JoinDinosaurs.java dans le répertoire /home/hadoop/join-lab avec le contenu suivant :

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
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.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class JoinDinosaurs {

    public static class JoinMapper extends Mapper<LongWritable, Text, Text, Text> {
        private final Text outKey = new Text();
        private final Text outValue = new Text();

        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            String line = value.toString();
            String[] parts = line.split(",");

            if (parts.length == 2) { // locations.txt
                outKey.set(parts[0]);
                outValue.set("LOC:" + parts[1]);
            } else if (parts.length == 3) { // dinosaurs.txt
                outKey.set(parts[0]);
                outValue.set("DIN:" + parts[1] + "," + parts[2]);
            }

            context.write(outKey, outValue);
        }
    }

    public static class JoinReducer extends Reducer<Text, Text, Text, Text> {
        private final Text outValue = new Text();

        @Override
        protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
            Map<String, String> dinMap = new HashMap<>();
            StringBuilder locBuilder = new StringBuilder();

            for (Text value : values) {
                String valStr = value.toString();
                if (valStr.startsWith("DIN:")) {
                    dinMap.put("DIN", valStr.substring(4));
                } else if (valStr.startsWith("LOC:")) {
                    locBuilder.append(valStr.substring(4)).append(",");
                }

                if (locBuilder.length() > 0) {
                    locBuilder.deleteCharAt(locBuilder.length() - 1);
                }
            }

            StringBuilder outBuilder = new StringBuilder();
            for (Map.Entry<String, String> entry : dinMap.entrySet()) {
                outBuilder.append(entry.getValue()).append("\t").append(locBuilder.toString().trim());
            }

            outValue.set(outBuilder.toString());
            context.write(key, outValue);
        }
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        if (args.length!= 2) {
            System.err.println("Usage: JoinDinosaurs <input_dir> <output_dir>");
            System.exit(1);
        }

        Job job = Job.getInstance();
        job.setJarByClass(JoinDinosaurs.class);
        job.setJobName("Join Dinosaurs");

        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));

        job.setMapperClass(JoinMapper.class);
        job.setReducerClass(JoinReducer.class);

        job.setInputFormatClass(TextInputFormat.class);
        job.setOutputFormatClass(TextOutputFormat.class);

        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);

        System.exit(job.waitForCompletion(true)? 0 : 1);
    }
}

Ce code définit un travail MapReduce avec un JoinMapper et un JoinReducer personnalisés. Le mappeur lit les données d'entrée à partir de dinosaurs.txt et locations.txt et émet des paires clé-valeur avec le nom du dinosaure comme clé et le type de données ("DIN" ou "LOC") ainsi que la valeur correspondante. Le réducteur effectue ensuite l'opération de jointure en regroupant les valeurs par clé et en combinant les informations sur le dinosaure avec l'emplacement.

Pour compiler le code, exécutez la commande suivante :

mkdir classes
javac -source 8 -target 8 -cp "/home/hadoop/hadoop/share/hadoop/common/hadoop-common-3.3.6.jar:/home/hadoop/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:/home/hadoop/hadoop/share/hadoop/common/lib/*" -d classes JoinDinosaurs.java
jar -cvf join-dinosaurs.jar -C classes/.

Ensuite, exécutez le travail MapReduce à l'aide de la commande suivante :

hadoop jar join-dinosaurs.jar JoinDinosaurs /home/hadoop/join-lab /home/hadoop/join-lab/output

Cette commande exécute la classe JoinDinosaurs à partir du fichier join-dinosaurs.jar, avec le répertoire d'entrée /home/hadoop/join-lab (contenant dinosaurs.txt et locations.txt) et le répertoire de sortie /home/hadoop/join-lab/output.

Une fois le travail terminé avec succès, vous pouvez consulter la sortie dans le répertoire /home/hadoop/join-lab/output.

Analysez la sortie

Dans cette étape, nous allons analyser la sortie de l'opération de jointure pour mieux comprendre le monde des dinosaures.

Tout d'abord, vérifions le contenu du répertoire de sortie :

hadoop fs -ls /home/hadoop/join-lab/output
hadoop fs -cat /home/hadoop/join-lab/output/part-r-00000

Vous devriez voir une sortie similaire à la suivante :

brachiosaurus    Brachiosaurus,herbivore    Africa
stegosaurus      Stegosaurus,herbivore      North America
trex     Tyrannosaurus Rex,carnivore        North America
velociraptor     Velociraptor,carnivore     Asia

Cette sortie montre les données jointes, chaque ligne contenant le nom du dinosaure, ses détails (espèce et régime alimentaire) et l'emplacement où ses fossiles ont été trouvés.

Sur la base de la sortie, nous pouvons faire les observations suivantes :

  • Le Tyrannosaurus Rex (T-Rex) et le Velociraptor étaient des dinosaures carnivores, tandis que le Brachiosaurus et le Stegosaurus étaient des herbivores.
  • Les fossiles de Brachiosaurus ont été trouvés en Afrique, les fossiles de Stegosaurus et de Tyrannosaurus Rex ont été trouvés en Amérique du Nord, et les fossiles de Velociraptor ont été trouvés en Asie.

Ces informations peuvent aider les paléontologues à mieux comprendre la distribution, le comportement et l'évolution des différentes espèces de dinosaures dans différentes régions géologiques.

Sommaire

Dans ce laboratoire, nous avons exploré l'implémentation d'une opération de jointure à l'aide de Hadoop MapReduce. En combinant des données provenant de multiples sources, nous avons pu obtenir des informations précieuses sur le monde des dinosaures, notamment leurs espèces, leurs régimes alimentaires et leurs emplacements de fossiles.

Le laboratoire a présenté le concept de jointure de données à l'aide de MapReduce, où le mappeur prépare les données pour l'opération de jointure et le réducteur effectue la jointure réelle en regroupant les valeurs par clé et en combinant les informations.

Grâce à l'expérience pratique de la configuration de l'environnement, de la préparation des données, de l'implémentation du travail MapReduce et de l'analyse de la sortie, nous avons acquis des connaissances pratiques sur la manière d'exploiter les puissantes capacités de traitement de données d'Hadoop pour résoudre des problèmes analytiques complexes.

Ce laboratoire n'a pas seulement approfondi notre compréhension des opérations de jointure, mais a également renforcé nos compétences en matière de travail avec Hadoop MapReduce, d'écriture de code Java et d'exécution de commandes dans un environnement Linux. L'expérience de la conception et de l'implémentation d'une solution complète à partir de zéro a été précieuse et contribuera sans aucun doute à notre croissance en tant qu'ingénieurs de données ou de scientifiques de données.