Hadoop & Mapreduce Eksempler: Lag første program i Java

Innholdsfortegnelse:

Anonim

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:

Data fra SalesJan2009

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,OutputCollector output,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 , . Denne utgangen fra kartleggeren blir inngang til reduseringsenheten. Så, for å justere med datatypen, brukes tekst og IntWritable som datatype her.

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,Iterator values,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 . Tekst er en datatype nøkkel og Iterator er en datatype for liste over verdier for den nøkkelen.

Det neste argumentet er av typen OutputCollector som samler utdataene fra reduksjonsfasen.

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();}