Introducció

En aquest tema, explorarem MapReduce i Hadoop, dues tecnologies fonamentals per al processament de grans volums de dades. MapReduce és un model de programació que permet el processament paral·lel de grans conjunts de dades, mentre que Hadoop és un marc de treball que implementa aquest model i proporciona una infraestructura robusta per al processament distribuït.

Objectius

  • Entendre el concepte de MapReduce i com funciona.
  • Aprendre sobre l'arquitectura de Hadoop i els seus components principals.
  • Implementar un exemple pràctic de MapReduce utilitzant Hadoop.

Conceptes Clau

MapReduce

MapReduce és un model de programació desenvolupat per Google per processar grans conjunts de dades de manera paral·lela. Consta de dues fases principals:

  1. Map: Aquesta fase pren un conjunt de dades d'entrada i el divideix en parelles clau-valor. Cada parella és processada per una funció de map que genera una llista intermèdia de parelles clau-valor.

  2. Reduce: Aquesta fase pren la llista intermèdia generada per la fase de map i combina les parelles clau-valor amb la mateixa clau per produir el resultat final.

Hadoop

Hadoop és un marc de treball de codi obert que implementa el model de MapReduce i proporciona una infraestructura per al processament distribuït de grans volums de dades. Els components principals de Hadoop són:

  • Hadoop Distributed File System (HDFS): Un sistema de fitxers distribuït que emmagatzema les dades en múltiples màquines.
  • YARN (Yet Another Resource Negotiator): Un sistema de gestió de recursos que coordina l'execució de les aplicacions.
  • MapReduce: El motor de processament que executa les tasques de MapReduce.

Arquitectura de Hadoop

A continuació es mostra una taula que resumeix els components principals de Hadoop i les seves funcions:

Component Funció
HDFS Emmagatzematge distribuït de dades
YARN Gestió de recursos i planificació de tasques
MapReduce Processament de dades en paral·lel

Exemple Pràctic de MapReduce amb Hadoop

Pas 1: Instal·lació de Hadoop

Abans de començar, assegura't de tenir Hadoop instal·lat i configurat al teu sistema. Pots seguir la guia oficial d'instal·lació de Hadoop.

Pas 2: Escriptura del Codi MapReduce

A continuació es mostra un exemple de codi MapReduce en Java per comptar la freqüència de paraules en un conjunt de dades:

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 java.io.IOException;
import java.util.StringTokenizer;

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();

        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());
                context.write(word, one);
            }
        }
    }

    public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
        private IntWritable result = new IntWritable();

        public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable val : values) {
                sum += val.get();
            }
            result.set(sum);
            context.write(key, result);
        }
    }

    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(TokenizerMapper.class);
        job.setCombinerClass(IntSumReducer.class);
        job.setReducerClass(IntSumReducer.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);
    }
}

Pas 3: Execució del Codi MapReduce

  1. Compila el codi Java:
javac -classpath `hadoop classpath` -d wordcount_classes WordCount.java
jar -cvf wordcount.jar -C wordcount_classes/ .
  1. Executa el treball MapReduce:
hadoop jar wordcount.jar WordCount /ruta/dades/entrada /ruta/dades/sortida

Exercicis Pràctics

Exercici 1: Comptar la Freqüència de Paraules

Modifica el codi de l'exemple per comptar la freqüència de paraules en un conjunt de dades diferent. Prova amb un text més gran i observa com Hadoop maneja el processament distribuït.

Exercici 2: Anàlisi de Logs

Implementa un treball MapReduce per analitzar logs de servidor web i comptar el nombre de visites per cada adreça IP.

Solucions

Solució a l'Exercici 1

Segueix els mateixos passos que en l'exemple pràctic, però utilitza un fitxer de text diferent com a entrada.

Solució a l'Exercici 2

  1. Escriu un Mapper que extregui l'adreça IP de cada línia de log.
  2. Escriu un Reducer que compti el nombre de visites per cada adreça IP.
  3. Compila i executa el treball MapReduce de manera similar a l'exemple pràctic.

Resum

En aquest tema, hem après sobre el model de programació MapReduce i el marc de treball Hadoop. Hem explorat la seva arquitectura i components principals, i hem implementat un exemple pràctic de MapReduce utilitzant Hadoop. A més, hem proposat exercicis pràctics per reforçar els conceptes apresos. En el proper tema, explorarem Apache Spark, una altra tecnologia clau per al processament de Big Data.

© Copyright 2024. Tots els drets reservats