Introducción a Hadoop

Hadoop es un marco de trabajo de código abierto que permite el procesamiento distribuido de grandes conjuntos de datos a través de clusters de computadoras utilizando modelos de programación simples. Fue desarrollado por Apache Software Foundation y se ha convertido en una de las tecnologías más populares para el procesamiento de datos masivos.

Conceptos Clave

  1. HDFS (Hadoop Distributed File System):

    • Sistema de archivos distribuido que almacena datos en bloques distribuidos a través de múltiples nodos.
    • Proporciona alta disponibilidad y tolerancia a fallos.
  2. MapReduce:

    • Modelo de programación que permite el procesamiento paralelo de grandes conjuntos de datos.
    • Consiste en dos fases principales: Map y Reduce.
  3. YARN (Yet Another Resource Negotiator):

    • Sistema de gestión de recursos que permite la gestión de recursos y la programación de tareas en el cluster.
  4. Hadoop Common:

    • Conjunto de utilidades y bibliotecas comunes que soportan otros módulos de Hadoop.

Arquitectura de Hadoop

Componente Descripción
HDFS Sistema de archivos distribuido que almacena datos en bloques distribuidos en múltiples nodos.
MapReduce Modelo de programación para el procesamiento paralelo de datos.
YARN Sistema de gestión de recursos y programación de tareas.
Hadoop Common Utilidades y bibliotecas comunes para otros módulos de Hadoop.

Instalación de Hadoop

Para instalar Hadoop, se pueden seguir los siguientes pasos:

  1. Descargar Hadoop:

    • Visita la página oficial de Apache Hadoop y descarga la versión más reciente.
  2. Configurar Variables de Entorno:

    • Configura las variables de entorno HADOOP_HOME y PATH.
  3. Configurar HDFS y YARN:

    • Edita los archivos de configuración core-site.xml, hdfs-site.xml, mapred-site.xml y yarn-site.xml.
  4. Formatear el Namenode:

    • Ejecuta el comando hdfs namenode -format para formatear el Namenode.
  5. Iniciar Servicios:

    • Inicia los servicios de HDFS y YARN utilizando los scripts start-dfs.sh y start-yarn.sh.

Ejemplo Práctico: Ejecutar un Trabajo MapReduce

A continuación, se muestra un ejemplo de cómo ejecutar un trabajo MapReduce en Hadoop.

Paso 1: Crear un Programa MapReduce

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

Paso 2: Compilar el Programa

javac -classpath `hadoop classpath` -d wordcount_classes WordCount.java
jar -cvf wordcount.jar -C wordcount_classes/ .

Paso 3: Ejecutar el Trabajo MapReduce

hadoop jar wordcount.jar WordCount /input /output

Ejercicio Práctico

Ejercicio: Implementa un programa MapReduce que cuente la frecuencia de cada letra en un conjunto de archivos de texto.

Solución:

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;

public class LetterCount {

    public static class LetterMapper extends Mapper<Object, Text, Text, IntWritable> {

        private final static IntWritable one = new IntWritable(1);
        private Text letter = new Text();

        public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
            char[] chars = value.toString().toCharArray();
            for (char c : chars) {
                if (Character.isLetter(c)) {
                    letter.set(Character.toString(c).toLowerCase());
                    context.write(letter, 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, "letter count");
        job.setJarByClass(LetterCount.class);
        job.setMapperClass(LetterMapper.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);
    }
}

Conclusión

En esta sección, hemos cubierto los conceptos básicos de Hadoop, su arquitectura, y cómo instalar y ejecutar un trabajo MapReduce. Hadoop es una herramienta poderosa para el procesamiento de datos masivos y proporciona una base sólida para construir soluciones de Big Data. En el próximo módulo, exploraremos Apache Kafka, una plataforma de streaming distribuido que complementa a Hadoop en el ecosistema de Big Data.

Procesamiento de Datos Masivos

Módulo 1: Introducción al Procesamiento de Datos Masivos

Módulo 2: Tecnologías de Almacenamiento

Módulo 3: Técnicas de Procesamiento

Módulo 4: Herramientas y Plataformas

Módulo 5: Optimización del Almacenamiento y Procesamiento

Módulo 6: Análisis de Datos Masivos

Módulo 7: Casos de Estudio y Aplicaciones Prácticas

Módulo 8: Buenas Prácticas y Futuro del Procesamiento de Datos Masivos

© Copyright 2024. Todos los derechos reservados