Primer Job #MapReduce: WordCount (contar palabras)

Primer Job MapReduce: WordCount (contar palabras)

Ahora que tenemos el emulador HDInsight configurado en la máquina virtual, podremos ejecutar un Job MapReduce para probar la instalación.

Primero subiremos algunos archivos de datos para HDFS y ejecutaremos un Job MapReduce para contar la frecuencia de palabras específicas en esos archivos.

El Job MapReduce ha sido empaquetado en el archivo:
hadoop-mapreduce-examples-2.4.0.2.1.3.0-1981.jar.

que encontrará en la carpeta:
C:\hdp\hadoop-2.4.0.2.1.3.0-1981\share\hadoop\mapreduce

Primer Job MapReduce: WordCount (contar palabras)

Y en la subcarpeta sources encontrará el código fuente

Primer Job MapReduce: WordCount (contar palabras)

Como podrá ver en el código de la clase WordCount, el Job MapReduce recibe dos argumentos: in (el path de la carpeta de entrada) y out (el path de la carpeta de salida)

/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional Information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.apache.hadoop.examples;

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

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 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();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();

if (otherArgs.length != 2) {
System.err.println("Usage: wordcount  ");
System.exit(2);
}

Job job = new Job(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(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);

}
}

Para nuestro ejercicio les daremos los valores:

in:

hdfs://localhost/user/HDIUser

out:

hdfs://localhost/user/HDIUser/WordCount_Output

NOTA: La carpeta de salida no puede ser una carpeta existente, de lo contrario el Job MapReduce fallará arrojando una FileAlreadyExistsException. Si desea ejecutar el Job MapReduce, por segunda vez, debe especificar una carpeta de salida diferente o eliminar la carpeta de salida existente.

Primer Job MapReduce: WordCount (contar palabras)

NOTA: Recuerde que estos archivos están en HDFS, así que no podrás encontrarlos en el sistema de archivos local (No los encontraras en el Explorador de Windows) ya que se distribuyen a través de los nodos del clúster como bloques (para archivos reales), y entradas de metadatos (para archivos y directorios) en el NameNode.

Para remover la carpeta de salida de nuestro ejercicio, deberá ejecutar el comando:

hdfs dfs -rm -r hdfs://WIN-I39DL509EE7:8020/user/HDIUser/WordCount_Output

Primer Job MapReduce: WordCount (contar palabras)

Para ejecutar el Job MapReduce

1. Haga doble click sobre el icono en su escritorio para abrir el “Hadoop Command Line“. La carpeta actual debe ser:       c:\hdp\hadoop-2.4.0.2.1.3.0-1981

Primer Job MapReduce: WordCount (contar palabras)

Si no es así, ejecute el comando:
cd %hadoop_home%

2. Ejecute los siguientes comandos Hadoop para hacer una carpeta HDFS para almacenar los archivos de entrada y de salida:
hadoop fs mkdir /user
hadoop fs
mkdir /user/HDIUser

Primer Job MapReduce: WordCount (contar palabras)

3. Ejecute el siguiente comando Hadoop para copiar algunos archivos de texto locales para HDFS:
hadoop fs copyFromLocal C:\hdp\hadoop-2.4.0.2.1.3.0-1981\share\doc\hadoop\common\*.txt /user/HDIUser

Primer Job MapReduce: WordCount (contar palabras)

4. Ejecute el siguiente comando para listar los archivos en la carpeta / user / HDIUser:
hadoop fs ls /user/HDIUser

Deberá ver…

Primer Job MapReduce: WordCount (contar palabras)

5. Ejecute el siguiente comando para ejecutar el Job MapReduce para contar palabras:
hadoop jar C:\hdp\hadoop-2.4.0.2.1.3.0-1981\share\hadoop\mapreduce\hadoopmapreduceexamples-2.4.0.2.1.3.0-1981.jar wordcount /user/HDIUser/*.txt /user/HDIUser/WordCount_Output

Primer Job MapReduce: WordCount (contar palabras)

Primer Job MapReduce: WordCount (contar palabras)

6. Ejecute el siguiente comando para mostrar, desde el archivo de salida, el número de palabras que contengan “windows”:
hadoop fs cat /user/HDIUser/WordCount_Output/partr-00000 | findstr “Windows”

Primer Job MapReduce: WordCount (contar palabras)

FELICIDADES!!

Ha ejecutado exitosamente su primer Job MapReduce

Para más información de los comandos de Hadoop, vea la guía de comandos de Apache.

Referencias:

Anuncios

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s