Saltar al contenido

Crear el primer programa en Java

En este tutorial, aprenderá a usar Hadoop con ejemplos de MapReduce. Los datos de entrada se utilizan SalesJan2009.csv. Contiene información relacionada con las ventas, como el nombre del producto, el precio, el método de pago, la ciudad, el país del cliente, etc. Es la meta Averigüe la cantidad de productos vendidos en cada país.

En este tutorial, aprenderá:

Primer Mapadoed Hadoop

Ahora, en este tutorial de MapReduce, crearemos nuestro primer programa Java MapReduce:

VentasEne2009 Data

Asegúrese de tener Hadoop instalado. Antes de comenzar el proceso real, cambie el usuario a ‘hduser’ (identificador usado con la configuración de Hadoop, puede cambiar al identificador de usuario usado durante la configuración de programación de Hadoop).

su - hduser_

Paso 1)

Crea un nuevo directorio con un nombre MapReduceTutorial como se muestra en el ejemplo de MapReduce a continuación

sudo mkdir MapReduceTutorial

Dar permisos

sudo chmod -R 777 MapReduceTutorial

SalesMapper.java

package SalesCountry;

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.*;

public class SalesMapper extends MapReduceBase implements Mapper <LongWritable, Text, Text, IntWritable> {
	private final static IntWritable one = new IntWritable(1);

	public void map(LongWritable key, Text value, OutputCollector <Text, IntWritable> output, Reporter reporter) throws IOException {

		String valueString = value.toString();
		String[] SingleCountryData = valueString.split(",");
		output.collect(new Text(SingleCountryData[7]), one);
	}
}

SalesCountryReducer.java

package SalesCountry;

import java.io.IOException;
import java.util.*;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.*;

public class SalesCountryReducer extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> {

	public void reduce(Text t_key, Iterator<IntWritable> values, OutputCollector<Text,IntWritable> output, Reporter reporter) throws IOException {
		Text key = t_key;
		int frequencyForCountry = 0;
		while (values.hasNext()) {
			// replace type of value with the actual type of our value
			IntWritable value = (IntWritable) values.next();
			frequencyForCountry += value.get();
			
		}
		output.collect(key, new IntWritable(frequencyForCountry));
	}
}


SalesCountryDriver.java

package SalesCountry;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapred.*;

public class SalesCountryDriver {
    public static void main(String[] args) {
        JobClient my_client = new JobClient();
        // Create a configuration object for the job
        JobConf job_conf = new JobConf(SalesCountryDriver.class);

        // Set a name of the Job
        job_conf.setJobName("SalePerCountry");

        // Specify data type of output key and value
        job_conf.setOutputKeyClass(Text.class);
        job_conf.setOutputValueClass(IntWritable.class);

        // Specify names of Mapper and Reducer Class
        job_conf.setMapperClass(SalesCountry.SalesMapper.class);
        job_conf.setReducerClass(SalesCountry.SalesCountryReducer.class);

        // Specify formats of the data type of Input and output
        job_conf.setInputFormat(TextInputFormat.class);
        job_conf.setOutputFormat(TextOutputFormat.class);

        // Set input and output directories using command line arguments, 
        //arg[0] = name of input directory on HDFS, and arg[1] =  name of output directory to be created to store the output file.

        FileInputFormat.setInputPaths(job_conf, new Path(args[0]));
        FileOutputFormat.setOutputPath(job_conf, new Path(args[1]));

        my_client.setConf(job_conf);
        try {
            // Run the job 
            JobClient.runJob(job_conf);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Descargar archivos aquí

Verifique los permisos de todos estos archivos

y si faltan los permisos de ‘lectura’, dé el mismo

Paso 2)

Exportar classpath como se muestra en el ejemplo de Hadoop a continuación

export CLASSPATH="$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.2.0.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-common-2.2.0.jar:$HADOOP_HOME/share/hadoop/common/hadoop-common-2.2.0.jar:~/MapReduceTutorial/SalesCountry/*:$HADOOP_HOME/lib/*"

Paso 3)

Compilacion Java archivos (estos archivos están presentes en el directorio Final-MapReduceHandsOn). Sus archivos de clase se colocarán en el directorio del paquete.

javac -d . SalesMapper.java SalesCountryReducer.java SalesCountryDriver.java

Esta advertencia se puede ignorar con seguridad.

Esta compilación creará un directorio en un directorio actual con el nombre del paquete especificado en el archivo fuente de Java (es decir, SalesCountry en nuestro caso) y coloque todos los archivos de clase compilados en él.

Paso 4)

Crea un archivo nuevo Manifest.txt

sudo gedit Manifest.txt

agregue las siguientes líneas,

Main-Class: SalesCountry.SalesCountryDriver

SalesCountry.SalesCountryDriver es el nombre de la clase principal. Tenga en cuenta que debe ingresar una clave al final de esta línea.

Paso 5)

Crear un archivo Jar

jar cfm ProductSalePerCountry.jar Manifest.txt SalesCountry/*.class

Verifique que se haya creado el archivo jar

Paso 6)

Iniciar Hadoop

$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh

Paso 7)

Copiar el archivo SalesJan2009.csv dentro ~ / inputMapReduce

Ahora use debajo del comando para copiar ~ / inputMapReduce a HDFS.

$HADOOP_HOME/bin/hdfs dfs -copyFromLocal ~/inputMapReduce /

Podemos ignorar con seguridad esta advertencia.

Confirme si un archivo se está copiando realmente o no.

$HADOOP_HOME/bin/hdfs dfs -ls /inputMapReduce

Paso 8)

Ejecutar publicación de MapReduce

$HADOOP_HOME/bin/hadoop jar ProductSalePerCountry.jar /inputMapReduce /mapreduce_output_sales

Esto creará un directorio de salida llamado mapreduce_output_sales en HDFS. El contenido de este directorio será un archivo con las ventas de productos por país.

Paso 9)

El resultado se puede ver a través de una interfaz de línea de comandos como,

$HADOOP_HOME/bin/hdfs dfs -cat /mapreduce_output_sales/part-00000

Los resultados también se pueden ver a través de una interfaz web como-

Abra un navegador web.

Ahora seleccione ‘Examinar el sistema de archivos’ y navegar a / mapreduce_output_sales

Abierto cuid-r-00000

Explicación de la clase SalesMapper

En esta sección, entenderemos la implementación SalesMapper sonó.

1. Comenzamos especificando el nombre del paquete para nuestra clase. SalesCountry es el nombre de nuestro paquete. Tenga en cuenta el resultado de la compilación, SalesMapper.class irá a un directorio llamado este paquete: SalesCountry.

A continuación, importamos paquetes de bibliotecas.

La siguiente imagen muestra una implementación de la misma. SalesMapper sonó-

Explicación del código de muestra:

1. SalesMapper- Definición de clase

SalesMapper clase pública expandiendo MapReduceBase en la aplicación Mapper {

Todas las clases de mapeadores deben expandirse desde MapReduceBase clase y debe implementar Mapeador interfaz.

2. Definir una función de ‘mapa’

public void map(LongWritable key,
         Text value,
OutputCollector<Text, IntWritable> output,
Reporter reporter) throws IOException

La mayor parte de la clase de Mapper es un ‘mapa ()’ un método que asume cuatro argumentos.

En cada llamada a ‘mapa ()’ método, un valor clave par (‘clave’ y ‘valor’ en este código) pasado.

‘mapa ()’ el método comienza dividiendo el texto de entrada obtenido como argumento. Utiliza el tokenizador para dividir estas líneas en palabras.

String valueString = value.toString();
String[] SingleCountryData = valueString.split(",");

Seo ‘,’ utilizado como limitador.

Después de esto, se crea un par usando un registro en el séptimo índice de la matriz ‘SingleCountryData’ y valor ‘1’.

output.collect (Nuevo texto (SingleCountryData)[7]), uno);

Estamos eligiendo un récord en el séptimo índice ya que necesitamos País datos y se encuentra en el séptimo índice de edición ‘SingleCountryData’.

Tenga en cuenta que nuestros datos de entrada están en el siguiente formato (donde País a las 7ú índice, con 0 como índice principal) – –

Transaction_date, Producto, Precio, Payment_Type, Nombre, Ciudad, Estado,País, Account_Created, Last_Login, Latitud, Longitud

El mapeador de salida es de nuevo un valor clave emparejar salida usando ‘recoger ()’ método de ‘OutputCollector’.

Explicación de la clase SalesCountryReducer

En esta sección, entenderemos la implementación VentasPaísReductor sonó.

1. Comenzamos especificando el nombre del paquete para nuestra clase. SalesCountry es el nombre del paquete externo. Tenga en cuenta el resultado de la compilación, SalesCountryReducer.class irá a un directorio llamado este paquete: SalesCountry.

A continuación, importamos paquetes de bibliotecas.

La siguiente imagen muestra una implementación de la misma. VentasPaísReductor sonó-

Explicación del Código:

1. Definición de la clase SalesCountryReducer

SalesCountryReducer de clase pública que extiende MapReduceBase a la aplicación Reducer {

Estos son los dos primeros tipos de datos, ‘Texto’ y ‘IntWritable’ son un tipo de datos de valor clave de entrada para el reductor.

Una salida de mapeador está en forma , . Esta salida del mapeador se introduce en el reductor. Entonces, para alinearse con su tipo de datos, Texto y IntWritable utilizado aquí como tipo de datos.

Los dos últimos tipos de datos, ‘Texto’ e ‘IntWritable’ son un tipo de datos generados por un reductor en forma de un par clave-valor.

Todas las clases de reductores deben extenderse desde MapReduceBase clase y debe implementar Reductor interfaz.

2. Definir una función ‘reducida’

public void reduce( Text t_key,
             Iterator<IntWritable> values,                           
             OutputCollector<Text,IntWritable> output,
             Reporter reporter) throws IOException {

Entrada al disminuir () un método con una lista de valores múltiples es clave.

Por ejemplo, en nuestro caso, será-

, , , , , .

Esto se llama reductor como

Por lo tanto, para aceptar argumentos de esta forma, se utilizan los dos primeros tipos de datos, a saber, Texto y Iterador . Texto es un tipo de datos clave y Iterador es un tipo de datos para una lista de valores para esa clave.

El siguiente argumento es de otro tipo. OutputCollector que recoge la salida de fase del reductor.

disminuir () el método comienza copiando un valor clave y comenzando un recuento de frecuencia a 0.

Clave de texto = t_key;
int triceadForCountry = 0;

Luego usando ‘y ‘ bucle, repetimos a través de la lista de valores asociados con la clave y calculamos la frecuencia final resumiendo todos los valores.

 while (values.hasNext()) {
            // replace type of value with the actual type of our value
            IntWritable value = (IntWritable) values.next();
            frequencyForCountry += value.get();
            
        }

Ahora enviamos el resultado al colector de salida en forma clave y recibido conteo de frecuencia.

El código de abajo

output.collect(key, new IntWritable(frequencyForCountry));

Explicación de la clase SalesCountryDriver

En esta sección, entenderemos la implementación VentasPaísDriver sonó

1. Comenzamos especificando el nombre del paquete para nuestra clase. SalesCountry es el nombre del paquete externo. Tenga en cuenta el resultado de la compilación, SalesCountryDriver.class irá al directorio llamado este paquete: SalesCountry.

Aquí hay una línea que especifica un nombre de paquete seguido de un código para importar paquetes de biblioteca.

2. Defina una clase de controlador que creará un nuevo trabajo para un cliente, un objeto de configuración y anunciará las clases Mapper y Reducer.

La clase de controlador es responsable de configurar nuestra publicación MapReduce para que se ejecute en Hadoop. En esta clase, especificamos nombre del trabajo, tipo de datos de entrada / salida y nombres de clases de asignador y reductor.

3. En el conjunto de códigos a continuación, configuramos los directorios de entrada y salida utilizados para consumir un conjunto de datos de entrada y producir una salida, respectivamente.

arg[0] y arg[1] si los argumentos de la línea de comando pasados ​​con un comando dado en MapReduce se hacen en la práctica, es decir,

$ HADOOP_HOME / bin / hadoop jar ProductSalePerCountry.jar / inputMapReduce / mapreduce_output_sales

4. Fomentar nuestro trabajo

Debajo del código, inicie MapReduce: ejecución del trabajo

try {
    // Run the job 
    JobClient.runJob(job_conf);
} catch (Exception e) {
    e.printStackTrace();
}