I denne opplæringen lærer du å bruke Hadoop med MapReduce-eksempler. Inndataene som brukes er SalesJan2009.csv. Den inneholder salgsrelatert informasjon som produktnavn, pris, betalingsmodus, by, klientland osv. Målet er å finne ut antall solgte produkter i hvert land.
I denne veiledningen vil du lære-
- Første Hadoop MapReduce-program
- Forklaring av SalesMapper Class
- Forklaring av SalesCountryReducer-klasse
- Forklaring av SalesCountryDriver-klassen
Første Hadoop MapReduce-program
Nå i denne MapReduce-opplæringen oppretter vi vårt første Java MapReduce-program:
Forsikre deg om at du har Hadoop installert. Før du begynner med den faktiske prosessen, bytter du bruker til 'hduser' (id brukt mens Hadoop-konfigurasjon, du kan bytte til bruker-ID som ble brukt under Hadoop-programmeringskonfigurasjonen).
su - hduser_
Trinn 1)
Opprett en ny katalog med navnet MapReduceTutorial som vist i eksempelet MapReduce nedenfor
sudo mkdir MapReduceTutorial
Gi tillatelser
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();}}}
Last ned filer her
Kontroller filtillatelsene til alle disse filene
og hvis "lesetillatelser" mangler, gi det samme-
Steg 2)
Eksporter klassesti som vist i Hadoop-eksemplet nedenfor
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/*"
Trinn 3)
Kompilere Java-filer (disse filene finnes i katalogen Final-MapReduceHandsOn ). Klassefilene blir lagt i pakkekatalogen
javac -d . SalesMapper.java SalesCountryReducer.java SalesCountryDriver.java
Denne advarselen kan ignoreres trygt.
Denne samlingen vil opprette en katalog i en gjeldende katalog med navnet på pakkenavnet spesifisert i java-kildefilen (dvs. i vårt tilfelle SalesCountry ) og legge alle kompilerte klassefiler i den.
Trinn 4)
Opprett en ny fil Manifest.txt
sudo gedit Manifest.txt
legg til følgende linjer i den,
Main-Class: SalesCountry.SalesCountryDriver
SalesCountry.SalesCountryDriver er navnet på hovedklassen. Vær oppmerksom på at du må trykke Enter-tasten på slutten av denne linjen.
Trinn 5)
Opprett en Jar-fil
jar cfm ProductSalePerCountry.jar Manifest.txt SalesCountry/*.class
Kontroller at jar-filen er opprettet
Trinn 6)
Start Hadoop
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
Trinn 7)
Kopier filen SalesJan2009.csv til ~ / inputMapReduce
Bruk nå kommandoen nedenfor for å kopiere ~ / inputMapReduce til HDFS.
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal ~/inputMapReduce /
Vi kan trygt ignorere denne advarselen.
Kontroller om en fil faktisk er kopiert eller ikke.
$HADOOP_HOME/bin/hdfs dfs -ls /inputMapReduce
Trinn 8)
Kjør MapReduce-jobb
$HADOOP_HOME/bin/hadoop jar ProductSalePerCountry.jar /inputMapReduce /mapreduce_output_sales
Dette vil opprette en utdatakatalog med navnet mapreduce_output_sales på HDFS. Innholdet i denne katalogen vil være en fil som inneholder produktsalg per land.
Trinn 9)
Resultatet kan sees gjennom kommandogrensesnittet som,
$HADOOP_HOME/bin/hdfs dfs -cat /mapreduce_output_sales/part-00000
Resultatene kan også sees via et webgrensesnitt som-
Åpne r i en nettleser.
Velg nå "Bla gjennom filsystemet" og naviger til / mapreduce_output_sales
Åpne del-r-00000
Forklaring av SalesMapper Class
I denne delen vil vi forstå implementeringen av SalesMapper- klassen.
1. Vi begynner med å spesifisere et pakkenavn for klassen vår. SalesCountry er navnet på pakken vår. Vær oppmerksom på at produksjonen av kompilering, SalesMapper.class, vil gå inn i en katalog som heter dette pakkenavnet: SalesCountry .
Etterfulgt av dette importerer vi bibliotekspakker.
Nedenfor viser øyeblikksbildet en implementering av SalesMapper klasse-
Eksempelkode Forklaring:
1. Definisjon av SalesMapper-klasse-
offentlig klasse SalesMapper utvider MapReduceBase implementerer Mapper
Hver kartklasse må utvides fra MapReduceBase- klassen, og den må implementere Mapper- grensesnitt.
2. Definere 'kart' funksjon-
public void map(LongWritable key,Text value,OutputCollectoroutput,Reporter reporter) throws IOException
Hoveddelen av Mapper-klassen er en 'map ()' -metode som godtar fire argumenter.
Ved hver samtale til 'map ()' - metoden blir et nøkkelverdipar ( 'nøkkel' og 'verdi' i denne koden) sendt.
'map ()' - metoden begynner med å dele inn tekst som mottas som et argument. Den bruker tokenizer for å dele disse linjene i ord.
String valueString = value.toString();String[] SingleCountryData = valueString.split(",");
Her brukes ',' som en avgrenser.
Etter dette dannes et par ved hjelp av en post ved syvende indeks av matrisen 'SingleCountryData' og en verdi '1' .
output.collect (ny tekst (SingleCountryData [7]), en);
Vi velger rekord på syvende indeksen fordi vi trenger Land data og det ligger på syvende indeksen i matrisen 'SingleCountryData' .
Vær oppmerksom på at inndata er i under format (der Land er på 7 th indeks, med 0 som startindeks) -
Transaksjonsdato, produkt, pris, betalingstype, navn, by, stat, land , konto_opprettet, siste_pålogging, bredde, lengdegrad
En utgang fra kartleggeren er igjen et nøkkelverdipar som sendes ut ved hjelp av 'collect ()' -metoden til 'OutputCollector' .
Forklaring av SalesCountryReducer-klasse
I denne delen vil vi forstå implementeringen av SalesCountryReducer- klassen.
1. Vi begynner med å spesifisere navnet på pakken for klassen vår. SalesCountry er et navn på utpakken . Vær oppmerksom på at produksjonen av kompilering, SalesCountryReducer.class, vil gå inn i en katalog kalt dette pakkenavnet: SalesCountry .
Etterfulgt av dette importerer vi bibliotekspakker.
Nedenfor viser øyeblikksbildet en implementering av SalesCountryReducer klasse-
Kode Forklaring:
1. SalesCountryReducer klasse definisjon-
offentlig klasse SalesCountryReducer utvider MapReduceBase implementerer Reducer
Her er de to første datatypene, 'Tekst' og 'IntWritable' , datatypen for inngangsnøkkelverdien til reduseringsenheten.
Utdata fra kartlegger er i form av
De to siste datatypene, 'Tekst' og 'IntWritable', er datatypen for utdata generert av reduseringsenheten i form av nøkkelverdipar.
Hver reduseringsklasse må utvides fra MapReduceBase- klassen, og den må implementere Reducer- grensesnitt.
2. Definere funksjonen 'reduser'
public void reduce( Text t_key,Iteratorvalues,OutputCollector output,Reporter reporter) throws IOException {
En inngang til redusere () metoden er en nøkkel med en liste over flere verdier.
For eksempel vil det i vårt tilfelle være-
Dette er gitt til reduseringsanordningen som
Så for å godta argumenter av dette skjemaet brukes de to første datatypene, nemlig Tekst og Iterator
Det neste argumentet er av typen OutputCollector
redusere () -metoden begynner med å kopiere nøkkelverdien og initialisere frekvensantallet til 0.
Tekstnøkkel = t_key; int-frekvensForCountry = 0;
Deretter, ved hjelp av ' while' loop, gjentar vi oss gjennom listen over verdier som er knyttet til nøkkelen og beregner den endelige frekvensen ved å oppsummere alle verdiene.
while (values.hasNext()) {// replace type of value with the actual type of our valueIntWritable value = (IntWritable) values.next();frequencyForCountry += value.get();}
Nå skyver vi resultatet til utgangssamleren i form av nøkkel og oppnådd frekvensantall .
Nedenfor koden gjør dette-
output.collect(key, new IntWritable(frequencyForCountry));
Forklaring av SalesCountryDriver-klassen
I denne delen vil vi forstå implementeringen av SalesCountryDriver- klassen
1. Vi begynner med å spesifisere et pakkenavn for klassen vår. SalesCountry er et navn på utpakken . Vær oppmerksom på at produksjonen av kompilering, SalesCountryDriver.class, vil gå til katalogen som er oppkalt etter dette pakkenavnet: SalesCountry .
Her er en linje som spesifiserer pakkenavn etterfulgt av kode for å importere bibliotekspakker.
2. Definer en sjåførklasse som vil opprette en ny klientjobb, konfigurasjonsobjekt og annonsere Mapper og Reducer klasser.
Førerklassen er ansvarlig for å sette MapReduce-jobben til å kjøre i Hadoop. I denne klassen spesifiserer vi jobbnavn, datatype input / output og navn på mapper- og reduksjonsklasser .
3. I kodebiten nedenfor setter vi inndata- og utdatakataloger som brukes til å konsumere henholdsvis inndatasett og produsere utdata.
arg [0] og arg [1] er kommandolinjeargumentene som sendes med en kommando gitt i MapReduce hands-on, dvs.
$ HADOOP_HOME / bin / hadoop jar ProductSalePerCountry.jar / inputMapReduce / mapreduce_output_sales
4. Utløs jobben vår
Nedenfor koden starter utførelsen av MapReduce jobb-
try {// Run the jobJobClient.runJob(job_conf);} catch (Exception e) {e.printStackTrace();}