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:
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,OutputCollectoroutput,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
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,Iteratorvalues,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
Det næste argument er af typen OutputCollector
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();}