Introducció

En aquest projecte, aplicarem els coneixements adquirits al llarg del curs per analitzar un conjunt de dades massiu utilitzant Hadoop. L'objectiu és proporcionar una experiència pràctica que permeti als estudiants comprendre com utilitzar Hadoop per resoldre problemes reals de grans dades.

Objectius del Projecte

  1. Configurar un entorn Hadoop funcional.
  2. Carregar i gestionar dades en HDFS.
  3. Desenvolupar i executar treballs MapReduce per analitzar les dades.
  4. Utilitzar eines de l'ecosistema Hadoop per enriquir l'anàlisi.

Requisits Previs

Abans de començar aquest projecte, assegura't de tenir:

  • Un clúster Hadoop configurat (pot ser un clúster local o un clúster en el núvol).
  • Coneixements bàsics de HDFS i MapReduce.
  • Familiaritat amb les eines de l'ecosistema Hadoop com Apache Pig, Hive, etc.

Pas 1: Configuració de l'Entorn

1.1 Instal·lació de Hadoop

Si no tens Hadoop instal·lat, segueix els passos del Mòdul 1: Configuració de l'entorn Hadoop per instal·lar i configurar Hadoop al teu sistema.

1.2 Verificació de la Instal·lació

Assegura't que el teu clúster Hadoop està funcionant correctament executant les següents comandes:

# Iniciar HDFS
start-dfs.sh

# Iniciar YARN
start-yarn.sh

# Verificar els serveis
jps

Pas 2: Carregar Dades en HDFS

2.1 Preparació del Conjunt de Dades

Per aquest projecte, utilitzarem un conjunt de dades públic. Descarrega el conjunt de dades des del següent enllaç: Conjunt de Dades Públic.

2.2 Carregar Dades en HDFS

Carrega el conjunt de dades en HDFS utilitzant les següents comandes:

# Crear un directori en HDFS
hdfs dfs -mkdir /user/nom_usuari/projecte1

# Carregar el fitxer CSV en HDFS
hdfs dfs -put dataset.csv /user/nom_usuari/projecte1/

Pas 3: Desenvolupar un Treball MapReduce

3.1 Introducció a MapReduce

Revisa el Mòdul 4: Programació MapReduce per refrescar els conceptes bàsics de MapReduce.

3.2 Escriure el Codi MapReduce

A continuació, es mostra un exemple de codi MapReduce per analitzar el conjunt de dades. Aquest codi compta la freqüència de paraules en el conjunt de dades.

Mapper

import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String[] words = value.toString().split("\\s+");
        for (String str : words) {
            word.set(str);
            context.write(word, one);
        }
    }
}

Reducer

import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int sum = 0;
        for (IntWritable val : values) {
            sum += val.get();
        }
        context.write(key, new IntWritable(sum));
    }
}

Driver

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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WordCount {
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "word count");
        job.setJarByClass(WordCount.class);
        job.setMapperClass(WordCountMapper.class);
        job.setCombinerClass(WordCountReducer.class);
        job.setReducerClass(WordCountReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

3.3 Compilar i Executar el Treball MapReduce

Compila el codi utilitzant javac i crea un fitxer JAR:

# Compilar els fitxers Java
javac -classpath `hadoop classpath` -d . WordCountMapper.java WordCountReducer.java WordCount.java

# Crear el fitxer JAR
jar -cvf wordcount.jar *.class

Executa el treball MapReduce:

hadoop jar wordcount.jar WordCount /user/nom_usuari/projecte1/dataset.csv /user/nom_usuari/projecte1/output

Pas 4: Utilitzar Eines de l'Ecosistema Hadoop

4.1 Apache Hive

Utilitza Apache Hive per executar consultes SQL sobre el conjunt de dades. Primer, crea una taula en Hive:

CREATE TABLE dataset (
    column1 STRING,
    column2 STRING,
    ...
) ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;

LOAD DATA INPATH '/user/nom_usuari/projecte1/dataset.csv' INTO TABLE dataset;

Executa una consulta simple:

SELECT column1, COUNT(*) FROM dataset GROUP BY column1;

4.2 Apache Pig

Utilitza Apache Pig per processar el conjunt de dades amb un llenguatge de script més senzill:

dataset = LOAD '/user/nom_usuari/projecte1/dataset.csv' USING PigStorage(',') AS (column1:chararray, column2:chararray, ...);
grouped_data = GROUP dataset BY column1;
counted_data = FOREACH grouped_data GENERATE group, COUNT(dataset);
DUMP counted_data;

Pas 5: Anàlisi i Conclusions

5.1 Anàlisi dels Resultats

Revisa els resultats obtinguts dels treballs MapReduce, les consultes Hive i els scripts Pig. Analitza les dades per obtenir informació valuosa.

5.2 Conclusions

  • Eficàcia de Hadoop: Hem vist com Hadoop pot gestionar i processar grans volums de dades de manera eficient.
  • Utilitat de les Eines: Eines com Hive i Pig faciliten l'anàlisi de dades amb sintaxi més amigable.
  • Aplicació Pràctica: Aquest projecte demostra com es poden aplicar els conceptes de Hadoop a problemes reals de grans dades.

Exercicis Pràctics

  1. Modifica el codi MapReduce per comptar la freqüència de paraules només en una columna específica del conjunt de dades.
  2. Crea una nova taula en Hive i executa una consulta més complexa que impliqui múltiples columnes.
  3. Escriu un script Pig que filtri les dades basant-se en una condició específica i després compti les ocurrències.

Solucions

Exercici 1: Modificar el codi MapReduce

Modifica el WordCountMapper per processar només una columna específica:

@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    String[] columns = value.toString().split(",");
    String columnData = columns[0]; // Suposant que volem processar la primera columna
    String[] words = columnData.split("\\s+");
    for (String str : words) {
        word.set(str);
        context.write(word, one);
    }
}

Exercici 2: Crear una nova taula en Hive

CREATE TABLE new_dataset (
    column1 STRING,
    column2 STRING,
    ...
) ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;

LOAD DATA INPATH '/user/nom_usuari/projecte1/new_dataset.csv' INTO TABLE new_dataset;

SELECT column1, column2, COUNT(*) FROM new_dataset GROUP BY column1, column2;

Exercici 3: Escriure un script Pig

filtered_data = FILTER dataset BY column1 == 'some_value';
grouped_data = GROUP filtered_data BY column2;
counted_data = FOREACH grouped_data GENERATE group, COUNT(filtered_data);
DUMP counted_data;

Conclusió

Aquest projecte ha proporcionat una experiència pràctica en l'ús de Hadoop per analitzar grans dades. Hem cobert des de la configuració de l'entorn fins a l'ús de MapReduce i altres eines de l'ecosistema Hadoop per realitzar anàlisis detallades. Amb aquests coneixements, estàs preparat per abordar projectes més complexos i aplicar Hadoop a problemes reals de grans dades.

© Copyright 2024. Tots els drets reservats