Hadoop & Primeri Mapreduce: ustvarite prvi program v Javi

Kazalo:

Anonim

V tej vadnici se boste naučili uporabljati Hadoop s primeri MapReduce. Uporabljeni vhodni podatki so SalesJan2009.csv. Vsebuje informacije o prodaji, kot so ime izdelka, cena, način plačila, mesto, država stranke itd. Cilj je ugotoviti število prodanih izdelkov v posamezni državi.

V tej vadnici boste izvedeli-

  • Prvi program Hadoop MapReduce
  • Pojasnilo razreda SalesMapper
  • Pojasnilo razreda SalesCountryReducer
  • Pojasnilo razreda SalesCountryDriver

Prvi program Hadoop MapReduce

Zdaj v tej vadnici MapReduce bomo ustvarili svoj prvi program Java MapReduce:

Podatki SalesJan2009

Prepričajte se, da imate nameščen Hadoop. Preden začnete z dejanskim postopkom, spremenite uporabnika v 'hduser' (id, uporabljen med konfiguracijo Hadoop, lahko preklopite na uporabniški ID, uporabljen med konfiguracijo Hadoop programiranja).

su - hduser_

Korak 1)

Ustvarite nov imenik z imenom MapReduceTutorial kot shwon v spodnjem primeru MapReduce

sudo mkdir MapReduceTutorial

Dajte dovoljenja

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

Prenesite datoteke tukaj

Preverite dovoljenja za datoteke vseh teh datotek

in če manjkajo dovoljenja za branje, podelite isto-

2. korak)

Izvozite pot učilnice, kot je prikazano v spodnjem primeru Hadoop

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

3. korak)

Sestavite datoteke Java (te datoteke so v imeniku Final-MapReduceHandsOn ). Datoteke razreda bodo shranjene v imenik paketov

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

To opozorilo lahko varno prezrete.

Ta kompilacija bo ustvarila imenik v trenutnem imeniku, imenovanem z imenom paketa, ki je določeno v izvorni datoteki java (tj. V našem primeru SalesCountry ), in vanj postavi vse prevedene datoteke razredov.

4. korak)

Ustvarite novo datoteko Manifest.txt

sudo gedit Manifest.txt

dodajte mu naslednje vrstice,

Main-Class: SalesCountry.SalesCountryDriver

SalesCountry.SalesCountryDriver je ime glavnega razreda. Na koncu te vrstice morate pritisniti tipko Enter.

5. korak)

Ustvarite datoteko Jar

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

Preverite, ali je ustvarjena datoteka jar

6. korak)

Zaženite Hadoop

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

7. korak)

Kopirajte datoteko SalesJan2009.csv v ~ / inputMapReduce

Zdaj uporabite spodnji ukaz za kopiranje ~ / inputMapReduce v HDFS.

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

To opozorilo lahko varno prezremo.

Preverite, ali je datoteka dejansko kopirana ali ne.

$HADOOP_HOME/bin/hdfs dfs -ls /inputMapReduce

8. korak)

Zaženite opravilo MapReduce

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

To bo ustvarilo izhodni imenik z imenom mapreduce_output_sales na HDFS. Vsebina tega imenika bo datoteka, ki vsebuje prodajo izdelkov po državah.

9. korak)

Rezultat je mogoče videti skozi ukazni vmesnik kot,

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

Rezultati so vidni tudi prek spletnega vmesnika

Odprite r v spletnem brskalniku.

Zdaj izberite 'Prebrskaj datotečni sistem' in se pomaknite do / mapreduce_output_sales

Odprite del-r-00000

Pojasnilo razreda SalesMapper

V tem razdelku bomo razumeli izvajanje razreda SalesMapper .

1. Najprej določimo ime paketa za naš razred. SalesCountry je ime našega paketa. Upoštevajte, da bo rezultat kompilacije SalesMapper.class šel v imenik, imenovan s tem imenom paketa: SalesCountry .

Sledi temu, uvozimo knjižnične pakete.

Spodnji posnetek prikazuje izvedbo razreda SalesMapper-

Razlaga vzorčne kode:

1. Opredelitev razreda SalesMapper-

javni razred SalesMapper razširja MapReduceBase implementira Mapper {

Vsak razred mapperja je treba razširiti iz razreda MapReduceBase in mora implementirati vmesnik Mapper .

2. Določitev funkcije 'map' -

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

Glavni del razreda Mapper je metoda 'map ()', ki sprejme štiri argumente.

Pri vsakem klicu metode 'map ()' se preda par ključ-vrednost ( 'key' in 'value' v tej kodi).

Metoda 'map ()' se začne z razdelitvijo vhodnega besedila, ki je prejeto kot argument. Tokenizer uporablja za razdelitev teh vrstic v besede.

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

Tu je ',' uporabljeno kot ločilo.

Po tem se par oblikuje z zapisom na 7. indeksu polja "SingleCountryData" in vrednostjo "1" .

output.collect (novo besedilo (SingleCountryData [7]), eno);

Zapis izberemo pri 7. indeksu, ker potrebujemo podatke o državi , nahaja pa se pri 7. indeksu v polju "SingleCountryData" .

Prosimo, upoštevajte, da je naša vhodne podatke v spodnji obliki (kjer Država je na 7 th indeks, z 0 kot začetni indeks) -

Datum transakcije, izdelek, cena, vrsta plačila, ime, mesto, država, država , ustvarjen račun, zadnja prijava, zemljepisna širina, zemljepisna dolžina

Izhod mapperja je spet par ključ-vrednost, ki se izpiše z uporabo metode 'collect ()' v 'OutputCollector' .

Pojasnilo razreda SalesCountryReducer

V tem razdelku bomo razumeli izvajanje razreda SalesCountryReducer .

1. Najprej določimo ime paketa za naš razred. SalesCountry je ime zunanjega paketa. Upoštevajte, da bo rezultat kompilacije SalesCountryReducer.class šel v imenik, imenovan s tem imenom paketa: SalesCountry .

Sledi temu, uvozimo knjižnične pakete.

Spodnji posnetek prikazuje izvedbo razreda SalesCountryReducer-

Razlaga kode:

1. Opredelitev razreda SalesCountryReducer-

javni razred SalesCountryReducer razširja MapReduceBase implementira reduktor {

Tu sta prva dva podatkovna tipa, 'Text' in 'IntWritable' , podatkovni tip vnosa ključ-vrednost v reduktor.

Izhod mapperja je v obliki , . Ta izhod mapperja postane vhod v reduktor. Za poravnavo s svojim podatkovnim tipom se tukaj kot podatkovni tip uporabljata Text in IntWritable .

Zadnji dve podatkovni vrsti, 'Text' in 'IntWritable' sta podatkovni vrsti izhodnih podatkov, ki jih ustvari reduktor v obliki para ključ-vrednost.

Vsak razred reduktorja je treba razširiti iz razreda MapReduceBase in mora izvajati vmesnik reduktorja .

2. Opredelitev funkcije „zmanjšanje“ -

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

Vhod za metodo zmanjševanja () je ključ s seznamom več vrednosti.

Na primer, v našem primeru bo

, , , , , .

To dobi reduktor kot

Torej, da sprejmemo argumente te oblike, se uporabita prva dva podatkovna tipa, in sicer Text in Iterator . Besedilo je podatkovni tip ključa in Iterator je podatkovni tip za seznam vrednosti tega ključa.

Naslednji argument je tipa OutputCollector , ki zbira izhod faze reduktorja.

metoda zmanjšanje () se začne s kopiranjem vrednosti ključa in inicializacijo števila frekvenc na 0.

Besedilna tipka = t_key; int frekvencaForCountry = 0;

Nato s pomočjo zanke ' while' preletimo seznam vrednosti, povezanih s ključem, in izračunamo končno frekvenco s seštevanjem vseh vrednosti.

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

Zdaj rezultat potisnemo na izhodni zbiralnik v obliki ključa in dobljenega števila frekvenc .

Spodaj koda to -

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

Pojasnilo razreda SalesCountryDriver

V tem razdelku bomo razumeli izvajanje razreda SalesCountryDriver

1. Najprej določimo ime paketa za naš razred. SalesCountry je ime zunanjega paketa. Upoštevajte, da bo rezultat kompilacije SalesCountryDriver.class prešel v imenik, imenovan s tem imenom paketa: SalesCountry .

Tu je vrstica, ki določa ime paketa, ki mu sledi koda za uvoz knjižničnih paketov.

2. Določite razred gonilnika, ki bo ustvaril novo opravilo odjemalca, konfiguracijski objekt in oglaševal razrede Mapper in Reducer.

Razred voznikov je odgovoren za nastavitev našega opravila MapReduce za izvajanje v Hadoopu. V tem razredu določimo ime opravila, podatkovni tip vhoda / izhoda in imena razredov mapper in reduktorja .

3. V spodnjem delčku kode nastavimo vhodni in izhodni imenik, ki se uporabljata za porabo vhodnega nabora podatkov in ustvarjanje izhodnih podatkov.

arg [0] in arg [1] sta argumenta ukazne vrstice, posredovana z ukazom, podanim v MapReduce hands-on, tj.

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

4. Sprožite naše delo

Pod začetkom izvajanja kode MapReduce -

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