Escribe el Mapper
En este paso, escribirás la clase Mapper para procesar los datos de entrada y emitir pares clave-valor intermedios.
Abre la terminal y sigue los pasos siguientes para comenzar.
Cambia el usuario a hadoop y luego cambia al directorio principal del usuario hadoop:
su - hadoop
Crea un archivo Java para la clase Mapper:
nano /home/hadoop/SpaceBattleMapper.java
Luego, agrega el siguiente código al archivo SpaceBattleMapper.java:
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Mapper.Context;
import java.io.IOException;
public class SpaceBattleMapper 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 {
// Divide la línea de entrada en palabras
String[] words = value.toString().split("\\s+");
// Emite un par clave-valor para cada palabra
for (String w : words) {
word.set(w);
context.write(word, one);
}
}
}
Consejos: Puedes copiar el código de la caja de prompt de la derecha y pegarlo con Ctrl + Shift + V en el editor nano abierto. Presiona Ctrl + O para guardar el archivo y Enter para confirmar cuando te lo solicite el editor nano. Finalmente, utiliza Ctrl + X para salir del editor.
La clase SpaceBattleMapper extiende la clase Mapper del marco de Hadoop. Se utiliza para procesar datos de entrada en forma de pares clave-valor, donde la clave es un LongWritable que representa el desplazamiento de bytes de la línea en el archivo de entrada, y el valor es un objeto Text que representa la línea de texto.
La clase define dos campos privados:
one: Un objeto IntWritable con un valor constante de 1. Esto se utiliza como el valor en los pares clave-valor emitidos.
word: Un objeto Text utilizado para almacenar cada palabra extraída de la línea de entrada.
El método map se anula para proporcionar la lógica de asignación específica:
- El valor de entrada
Text se convierte en una cadena y se divide en palabras en función de los espacios en blanco.
- Para cada palabra en el array, el objeto
word se establece en esa palabra, y se emite un par clave-valor con la palabra como clave y one como valor. Esto se hace utilizando el método context.write.
Esta clase Mapper está diseñada para emitir un par clave-valor para cada palabra en los datos de entrada, con la palabra como clave y el entero 1 como valor. Esta configuración se utiliza comúnmente en aplicaciones de conteo de palabras, donde el objetivo es contar la ocurrencia de cada palabra en un conjunto de datos.