Implementando el Mapper y el Reducer
En este paso, crearemos una clase Mapper y una clase Reducer para procesar los datos de los libros utilizando el paradigma MapReduce.
BookMapper personalizado
Primero, cree un nuevo archivo Java llamado BookMapper.java
en el directorio /home/hadoop
con el siguiente contenido:
import java.io.IOException;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
// BookMapper extiende la clase Mapper para procesar archivos de entrada de texto
// Las parejas de claves-valores de entrada son LongWritable (número de línea) y Text (contenido de línea)
// Las parejas de claves-valores de salida son Text (nombre del autor) y Book (detalles del libro)
public class BookMapper extends Mapper<LongWritable, Text, Text, Book> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// Divide la línea de entrada por coma
String[] bookData = value.toString().split(",");
// Extrae el título, el autor y el año de la línea de entrada
String title = bookData[0];
String author = bookData[1];
int year = Integer.parseInt(bookData[2]);
// Escribe el autor y los detalles del libro en el contexto
context.write(new Text(author), new Book(title, author, year));
}
}
Esta clase BookMapper
toma una línea de datos de entrada en el formato "título,autor,año"
y emite una pareja de claves-valores con el autor como clave y un objeto Book
como valor.
BookReducer personalizado
A continuación, cree un nuevo archivo Java llamado BookReducer.java
en el directorio /home/hadoop
con el siguiente contenido:
import java.io.IOException;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
// BookReducer extiende la clase Reducer para agrupar los detalles de los libros por autor
// Las parejas de claves-valores de entrada son Text (nombre del autor) y Book (detalles del libro)
// Las parejas de claves-valores de salida son Text (nombre del autor) y Book (detalles de los libros agrupados)
public class BookReducer extends Reducer<Text, Book, Text, Book> {
@Override
protected void reduce(Text key, Iterable<Book> values, Context context) throws IOException, InterruptedException {
// Itera a través de los libros del mismo autor y escribe cada libro en el contexto
for (Book book : values) {
context.write(key, book);
}
}
}
Esta clase BookReducer
simplemente emite las parejas de claves-valores de entrada tal como están, agrupando efectivamente los libros por autor.
Compilar los archivos
Finalmente, deberá compilar las clases Java usando los siguientes comandos:
## Compile las clases Java
javac -source 8 -target 8 -classpath $HADOOP_HOME/share/hadoop/common/hadoop-common-3.3.6.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:. BookMapper.java BookReducer.java