Suma de números pares e impares en MapReduce usando Cloudera Distribution Hadoop (CDH)

Requisitos previos: Hadoop y MapReduce

Contar el número de pares e impares y encontrar su suma en cualquier idioma es pan comido como en C, C++, Python, Java, etc. MapReduce también usa Java para escribir el programa, pero es muy fácil si conoce la sintaxis. como escribirlo Es el básico de MapReduce. Primero aprenderá cómo ejecutar este código similar al programa «Hello World» en otros lenguajes de programación. Aquí están los pasos que muestran cómo escribir un código de MapReduce para contar y sumar números pares e impares.
Ejemplo:
Entrada: 
 

1 2 3 4 5 6 7 8 9 

Producción: 
 

Even    20   // sum of even numbers
Even    4    // count of even numbers 
Odd    25    // sum of odd numbers
Odd    5     // count of odd numbers

Pasos: 
 

  • Primero abra Eclipse -> luego seleccione Archivo -> Nuevo -> Proyecto Java -> Nómbrelo EvenOdd -> luego Finalizar .
     

  • class=”alignnone size-full wp-image-1045790″ />
  • Cree tres clases de Java en el proyecto. Nómbrelos EODriver (que tiene la función principal), EOMapper , EOReducer .
  • Debe incluir dos bibliotecas de referencia para eso:
    haga clic con el botón derecho en Proyecto -> luego seleccione Ruta de compilación -> Haga clic en Configurar ruta de compilación
     

  • En la figura anterior, puede ver la opción Agregar JAR externos en el lado derecho. Haga clic en él y agregue los archivos de mención a continuación. Puede encontrar estos archivos en /usr/lib/
    1. /usr/lib/hadoop-0.20-mapreduce/hadoop-core-2.6.0-mr1-cdh5.13.0.jar 
    2. /usr/lib/hadoop/hadoop- común-2.6.0-cdh5.13.0.jar
     

Código Mapper: Tienes que copiar y pegar este programa en el archivo EOMapper Java Class. 

Java

// Importing libraries
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.Mapper;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reporter;
 
public class EOMapper extends MapReduceBase implements Mapper<LongWritable,
                                                 Text, Text, IntWritable> {
 
    @Override
    // Map function
    public void map(LongWritable key, Text value, OutputCollector<Text,
                                     IntWritable> output, Reporter rep)
 
    throws IOException
    {
        // Splitting the line into spaces
        String data[] = value.toString().split(" ");
 
        for (String num : data)
        {
 
            int number = Integer.parseInt(num);
 
            if (number % 2 == 1)
            {
                // For Odd Numbers
                output.collect(new Text("ODD"), new IntWritable(number));
            }
 
            else
            {
                // For Even Numbers
                output.collect(new Text("EVEN"),
                       new IntWritable(number));
            }
        }
    }
}

Código reductor: debe copiar y pegar este programa en el archivo EOReducer Java Class.
 

Java

// Importing libraries
import java.io.IOException;
import java.util.Iterator;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reducer;
import org.apache.hadoop.mapred.Reporter;
 
public class EOReducer extends MapReduceBase implements Reducer<Text,
                                   IntWritable, Text, IntWritable> {
 
    @Override
    // Reduce Function
    public void reduce(Text key, Iterator<IntWritable> value,
     OutputCollector<Text, IntWritable> output, Reporter rep)
 
    throws IOException
    {
 
        // For finding sum and count of even and odd
        // you don't have to take different variables
        int sum = 0, count = 0;
        if (key.equals("ODD"))
        {
            while (value.hasNext())
            {
                IntWritable i = value.next();
 
                // Finding sum and count of ODD Numbers
                sum += i.get();
                count++;
            }
        }
 
        else
        {
            while (value.hasNext())
            {
                IntWritable i = value.next();
 
                // Finding sum and count of EVEN Numbers
                sum += i.get();
                count++;
            }
        }
 
        // First sum then count is printed
        output.collect(key, new IntWritable(sum));
        output.collect(key, new IntWritable(count));
    }
}

Código del controlador: debe copiar y pegar este programa en el archivo EODriver Java Class.
 

Java

// Importing libraries
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
 
public class EODriver extends Configured implements Tool {
 
    @Override
    public int run(String[] args) throws Exception
    {
        if (args.length < 2)
        {
            System.out.println("Please enter valid arguments");
            return -1;
        }
 
        JobConf conf = new JobConf(EODriver.class);
        FileInputFormat.setInputPaths(conf, new Path(args[0]));
        FileOutputFormat.setOutputPath(conf, new Path(args[1]));
        conf.setMapperClass(EOMapper.class);
        conf.setReducerClass(EOReducer.class);
        conf.setMapOutputKeyClass(Text.class);
        conf.setMapOutputValueClass(IntWritable.class);
        conf.setOutputKeyClass(Text.class);
        conf.setOutputValueClass(IntWritable.class);
 
        JobClient.runJob(conf);
        return 0;
    }
 
    // Main Method
    public static void main(String args[]) throws Exception
    {
        int exitcode = ToolRunner.run(new EODriver(), args);
        System.out.println(exitcode);
    }
}
  • Ahora tienes que hacer un archivo jar. Haga clic con el botón derecho en Proyecto -> Haga clic en Exportar -> Seleccione el destino de exportación como Archivo Jar -> Asigne un nombre al archivo jar (EvenOdd.jar) -> Haga clic en Siguiente -> por último , haga clic en Finalizar . Ahora copie este archivo en el directorio Workspace de Cloudera
     

  •  

  •  

  • Abra la terminal en CDH y cambie el directorio al espacio de trabajo. Puede hacer esto usando el comando «cd workspace/». Ahora, cree un archivo de texto ( EOFile.txt ) y muévalo a HDFS. Para ese terminal abierto y escriba este código (recuerde que debe estar en el mismo directorio que el archivo jar que acaba de crear).
     

  • Ahora, ejecute este comando para copiar el archivo de entrada del archivo en el HDFS.
hadoop fs -put EOFile.txt EOFile.txt

  • Ahora para ejecutar el archivo jar usando la siguiente sintaxis: «hadoop jar JarFilename DriverClassName TextFileName OutPutFolderName»
     

  • Después de ejecutar el código, puede ver el resultado en el archivo EOOutput o escribiendo el siguiente comando en la terminal.
hadoop fs -cat EOOutput/part-00000

Publicación traducida automáticamente

Artículo escrito por Ankit_Bisht y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *