Hadoop & Mapreduce eksempler: Opret første program i Java

Indholdsfortegnelse:

Anonim

I denne vejledning lærer du at bruge Hadoop med MapReduce-eksempler. De anvendte inputdata er SalesJan2009.csv. Den indeholder salgsrelaterede oplysninger som produktnavn, pris, betalingstilstand, by, klientland osv. Målet er at finde ud af antallet af solgte produkter i hvert land.

I denne vejledning lærer du-

  • Første Hadoop MapReduce-program
  • Forklaring af SalesMapper-klasse
  • Forklaring til SalesCountryReducer-klassen
  • Forklaring af SalesCountryDriver-klassen

Første Hadoop MapReduce-program

Nu i denne MapReduce-vejledning opretter vi vores første Java MapReduce-program:

Data fra SalesJan2009

Sørg for, at du har Hadoop installeret. Inden du starter med den aktuelle proces, skal du skifte bruger til 'hduser' (id brugt under Hadoop-konfiguration, du kan skifte til den bruger-id, der blev brugt under din Hadoop-programmeringskonfiguration).

su - hduser_

Trin 1)

Opret en ny mappe med navnet MapReduceTutorial som shwon i nedenstående MapReduce-eksempel

sudo mkdir MapReduceTutorial

Giv tilladelser

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  {private final static IntWritable one = new IntWritable(1);public void map(LongWritable key, Text value, OutputCollector  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 {public void reduce(Text t_key, Iterator values, OutputCollector 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 valueIntWritable 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 jobJobConf job_conf = new JobConf(SalesCountryDriver.class);// Set a name of the Jobjob_conf.setJobName("SalePerCountry");// Specify data type of output key and valuejob_conf.setOutputKeyClass(Text.class);job_conf.setOutputValueClass(IntWritable.class);// Specify names of Mapper and Reducer Classjob_conf.setMapperClass(SalesCountry.SalesMapper.class);job_conf.setReducerClass(SalesCountry.SalesCountryReducer.class);// Specify formats of the data type of Input and outputjob_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 jobJobClient.runJob(job_conf);} catch (Exception e) {e.printStackTrace();}}}

Download filer her

Kontroller filtilladelserne for alle disse filer

og hvis der ikke læses tilladelser, skal du give det samme-

Trin 2)

Eksporter klassesti som vist i nedenstående Hadoop-eksempel

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/*"

Trin 3)

Kompilér Java-filer (disse filer findes i kataloget Final-MapReduceHandsOn ). Dens klassefiler placeres i pakkebiblioteket

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

Denne advarsel kan ignoreres sikkert.

Denne kompilering opretter en mappe i en aktuel mappe med navnet pakke, der er angivet i java-kildefilen (dvs. i vores tilfælde SalesCountry ) og lægger alle kompilerede klassefiler i den.

Trin 4)

Opret en ny fil Manifest.txt

sudo gedit Manifest.txt

tilføj følgende linjer til det,

Main-Class: SalesCountry.SalesCountryDriver

SalesCountry.SalesCountryDriver er navnet på hovedklassen. Bemærk, at du skal trykke på Enter-tasten i slutningen af ​​denne linje.

Trin 5)

Opret en Jar-fil

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

Kontroller, at jar-filen er oprettet

Trin 6)

Start Hadoop

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

Trin 7)

Kopier filen SalesJan2009.csv til ~ / inputMapReduce

Brug nu kommandoen nedenfor til at kopiere ~ / inputMapReduce til HDFS.

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

Vi kan med sikkerhed ignorere denne advarsel.

Kontroller, om en fil faktisk er kopieret eller ej.

$HADOOP_HOME/bin/hdfs dfs -ls /inputMapReduce

Trin 8)

Kør MapReduce job

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

Dette opretter en outputkatalog med navnet mapreduce_output_sales på HDFS. Indholdet af denne mappe er en fil, der indeholder produktsalg pr. Land.

Trin 9)

Resultatet kan ses gennem kommandogrænsefladen som,

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

Resultater kan også ses via en webgrænseflade som-

Åbn r i en webbrowser.

Vælg nu 'Gennemse filsystemet' og naviger til / mapreduce_output_sales

Åbn del-r-00000

Forklaring af SalesMapper-klasse

I dette afsnit vil vi forstå implementeringen af SalesMapper- klassen.

1. Vi begynder med at angive et pakkenavn til vores klasse. SalesCountry er et navn på vores pakke. Bemærk, at output fra kompilering, SalesMapper.class , går ind i en mappe navngivet efter dette pakkenavn: SalesCountry .

Efterfulgt af dette importerer vi bibliotekspakker.

Nedenstående øjebliksbillede viser en implementering af SalesMapper klasse-

Prøvekode Forklaring:

1. Definition af SalesMapper-klasse-

offentlig klasse SalesMapper udvider MapReduceBase implementerer Mapper {

Hver kortklasse skal udvides fra MapReduceBase- klassen, og den skal implementere Mapper- interface.

2. Definition af 'kort' funktion-

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

Hoveddelen af ​​Mapper-klassen er en 'map ()' -metode, der accepterer fire argumenter.

Ved hvert opkald til 'map ()' - metode overføres et nøgleværdipar ( 'nøgle' og 'værdi' i denne kode).

'map ()' - metoden begynder med at opdele inputtekst, der modtages som et argument. Det bruger tokenizer til at opdele disse linjer i ord.

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

Her, ',' bruges som en afgrænser.

Herefter dannes et par ved hjælp af en post ved 7. indeks af array 'SingleCountryData' og en værdi '1' .

output.collect (ny tekst (SingleCountryData [7]), en);

Vi vælger rekord på 7th indeks, fordi vi har brug for Land -data, og det er placeret på 7. indeks i matrix 'SingleCountryData' .

Bemærk venligst, at vores input data i nedenstående format (hvor Land er på 7 th indeks, med 0 som en start index) -

Transaktionsdato, produkt, pris, betalingstype, navn, by, stat, land , konto_oprettet, sidste_login, bredde, længdegrad

En output fra mapper er igen et nøgleværdipar, der udsendes ved hjælp af 'collect ()' -metoden til 'OutputCollector' .

Forklaring til SalesCountryReducer-klassen

I dette afsnit vil vi forstå implementeringen af SalesCountryReducer- klassen.

1. Vi begynder med at angive et navn på pakken til vores klasse. SalesCountry er et navn på vores pakke. Bemærk, at output fra kompilering, SalesCountryReducer.class , går ind i en mappe navngivet af dette pakkenavn: SalesCountry .

Efterfulgt af dette importerer vi bibliotekspakker.

Nedenstående øjebliksbillede viser en implementering af SalesCountryReducer klasse-

Kode Forklaring:

1. Definition af SalesCountryReducer-klasse-

offentlig klasse SalesCountryReducer udvider MapReduceBase implementerer Reducer {

Her er de to første datatyper, 'Tekst' og 'IntWritable' , datatypen af ​​input-nøgleværdi til reduceren.

Output af mapper er i form af , . Denne output fra kortlæggeren bliver input til reduceringsenheden. Så for at justere med datatypen bruges tekst og IntWritable som datatype her.

De sidste to datatyper, 'Tekst' og 'IntWritable' er datatypen af ​​output, der genereres af reduceringsenheden i form af nøgleværdipar.

Hver reduceringsklasse skal udvides fra MapReduceBase- klassen, og den skal implementere Reducer- interface.

2. Definition af 'reducer' funktion-

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

Et input til reduceringsmetoden () er en nøgle med en liste over flere værdier.

For eksempel vil det i vores tilfælde være-

, , , , , .

Dette gives til reducereren som

Så for at acceptere argumenter af denne form bruges de første to datatyper, nemlig Tekst og Iterator . Tekst er en datatype nøgle, og Iterator er en datatype til en liste over værdier for den nøgle.

Det næste argument er af typen OutputCollector , der samler output fra reduceringsfasen.

reducere () -metoden begynder med at kopiere nøgleværdi og initialisere frekvensantal til 0.

Tekstnøgle = t_key; int-frekvensForCountry = 0;

Derefter gentager vi ' while' -sløjfen gennem listen over værdier, der er knyttet til nøglen, og beregner den endelige frekvens ved at opsummere alle værdierne.

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

Nu skubber vi resultatet til udgangssamleren i form af nøgle og opnået frekvensantal .

Nedenfor kode gør dette-

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

Forklaring af SalesCountryDriver-klassen

I dette afsnit vil vi forstå implementeringen af SalesCountryDriver- klassen

1. Vi begynder med at angive et pakkenavn til vores klasse. SalesCountry er et navn på vores pakke. Bemærk, at output fra kompilering, SalesCountryDriver.class , går til biblioteket navngivet af dette pakkenavn: SalesCountry .

Her er en linje, der angiver pakkens navn efterfulgt af kode til import af bibliotekspakker.

2. Definer en driverklasse, der opretter et nyt klientjob, konfigurationsobjekt og reklamerer for Mapper og Reducer klasser.

Førerklassen er ansvarlig for at indstille vores MapReduce-job til at køre i Hadoop. I denne klasse specificerer vi jobnavn, datatype input / output og navne på mapper- og reducerklasser .

3. I nedenstående kodestykke indstiller vi input- og outputmapper, som bruges til at forbruge henholdsvis inputdatasæt og producere output.

arg [0] og arg [1] er kommandolinjeargumenter, der sendes med en kommando givet i MapReduce hands-on, dvs.

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

4. Udløs vores job

Nedenfor start af kode start af MapReduce job-

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