Escribiendo el Mapper y el Reducer
En este paso, profundizaremos en el corazón de Hadoop MapReduce y crearemos nuestras propias clases Mapper y Reducer.
Explorar el archivo de datos
Primero, use el comando su - hadoop
para cambiar de identidad. El archivo de datos data.txt
se almacena en el directorio /user/hadoop/input
de HDFS, que almacena el contenido de algunas conversaciones de personas. Use el siguiente comando para ver el contenido:
hdfs dfs -cat /user/hadoop/input/data.txt
Mapper personalizado
A continuación, crearemos una clase Mapper personalizada llamada WordCountMapper
que extiende Mapper
. Este Mapper procesará los datos de entrada y emitirá pares clave-valor, teniendo en cuenta que los datos procesados son el contenido de cada línea de la conversación, no los nombres de las personas. Consulte el siguiente ejemplo para completar el método map
en WordCountMapper.java
en /home/hadoop/
.
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// Convertir el objeto Text a una String
String line = value.toString();
// Tokenizar la cadena usando StringTokenizer
StringTokenizer tokenizer = new StringTokenizer(line);
// Iterar a través de cada token y escribirlos en el contexto
while (tokenizer.hasMoreTokens()) {
// Establecer la palabra actual
word.set(tokenizer.nextToken().trim());
// Escribir la palabra y su conteo en el contexto
context.write(word, one);
}
}
Luego use el siguiente comando para compilar el código en la versión de java 8:
javac -source 8 -target 8 -cp $HADOOP_HOME/share/hadoop/common/hadoop-common-3.3.6.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:. WordCountMapper.java
Reducer personalizado
Finalmente, crearemos una clase Reducer personalizada llamada WordCountReducer
que extiende Reducer
. Este Reducer agregará los valores para cada clave y emitirá el resultado final. Complete el método reduce
en WordCountReducer.java
en /home/hadoop/
con el siguiente ejemplo.
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
// Inicializar una variable para almacenar la suma de los conteos para cada palabra
int sum = 0;
// Iterar a través de todos los conteos para la palabra actual y calcular la suma total
for (IntWritable value : values) {
sum += value.get();
}
// Establecer el conteo final para la palabra actual
result.set(sum);
// Escribir la palabra y su conteo final en el contexto
context.write(key, result);
}
Luego use el siguiente comando para compilar el código en la versión de java 8:
javac -source 8 -target 8 -cp $HADOOP_HOME/share/hadoop/common/hadoop-common-3.3.6.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:. WordCountReducer.java