U ovom vodiču naučit ćete koristiti Hadoop s primjerima MapReduce. Ulazni podaci koji se koriste su SalesJan2009.csv. Sadrži informacije povezane s prodajom poput naziva proizvoda, cijene, načina plaćanja, grada, zemlje klijenta itd. Cilj je saznati broj proizvoda koji se prodaju u svakoj zemlji.
U ovom vodiču naučit ćete-
- Prvi program Hadoop MapReduce
- Objašnjenje klase SalesMapper
- Objašnjenje klase SalesCountryReducer
- Objašnjenje klase SalesCountryDriver
Prvi program Hadoop MapReduce
Sada ćemo u ovom vodiču za MapReduce stvoriti prvi program Java MapReduce:
Provjerite je li instaliran Hadoop. Prije nego što započnete sa stvarnim postupkom, promijenite korisnika u 'hduser' (id koji se koristi za vrijeme konfiguracije Hadoop-a, možete se prebaciti na korisnički ID koji se koristio tijekom vaše konfiguracije Hadoop programiranja).
su - hduser_
Korak 1)
Stvorite novi direktorij s imenom MapReduceTutorial kao shwon u donjem primjeru MapReduce
sudo mkdir MapReduceTutorial
Dajte dozvole
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();}}}
Preuzmite datoteke ovdje
Provjerite dozvole datoteka svih ovih datoteka
a ako nedostaju dozvole za čitanje, odobrite isto-
Korak 2)
Izvezite put do klase kao što je prikazano u donjem primjeru Hadoop-a
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/*"
Korak 3)
Sastavite Java datoteke (ove datoteke su prisutne u direktoriju Final-MapReduceHandsOn ). Datoteke klase stavit će se u direktorij paketa
javac -d . SalesMapper.java SalesCountryReducer.java SalesCountryDriver.java
Ovo se upozorenje može sigurno zanemariti.
Ova će kompilacija stvoriti direktorij u trenutnom direktoriju nazvanom imenom paketa navedenim u java izvornoj datoteci (tj. SalesCountry u našem slučaju) i u nju staviti sve prevedene datoteke klase.
Korak 4)
Stvorite novu datoteku Manifest.txt
sudo gedit Manifest.txt
dodajte mu sljedeće redove,
Main-Class: SalesCountry.SalesCountryDriver
SalesCountry.SalesCountryDriver naziv je glavne klase. Napominjemo da morate pritisnuti tipku Enter na kraju ovog retka.
Korak 5)
Stvorite Jar datoteku
jar cfm ProductSalePerCountry.jar Manifest.txt SalesCountry/*.class
Provjerite je li izrađena datoteka jar
Korak 6)
Pokrenite Hadoop
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
Korak 7)
Kopirajte datoteku SalesJan2009.csv u ~ / inputMapReduce
Sada Koristite naredbu ispod za kopiranje ~ / inputMapReduce na HDFS.
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal ~/inputMapReduce /
Ovo upozorenje možemo sigurno ignorirati.
Provjerite je li datoteka stvarno kopirana ili nije.
$HADOOP_HOME/bin/hdfs dfs -ls /inputMapReduce
Korak 8)
Pokrenite zadatak MapReduce
$HADOOP_HOME/bin/hadoop jar ProductSalePerCountry.jar /inputMapReduce /mapreduce_output_sales
Ovo će stvoriti izlazni direktorij nazvan mapreduce_output_sales na HDFS-u. Sadržaj ovog direktorija bit će datoteka koja sadrži prodaju proizvoda po zemljama.
Korak 9)
Rezultat se kroz naredbeno sučelje može vidjeti kao,
$HADOOP_HOME/bin/hdfs dfs -cat /mapreduce_output_sales/part-00000
Rezultati se također mogu vidjeti putem web sučelja kao-
Otvorite r u web pregledniku.
Sada odaberite "Pregledaj datotečni sustav" i idite na / mapreduce_output_sales
Otvorite dio-r-00000
Objašnjenje klase SalesMapper
U ovom ćemo odjeljku razumjeti implementaciju klase SalesMapper .
1. Započinjemo određivanjem naziva paketa za našu klasu. SalesCountry naziv je našeg paketa. Imajte na umu da će izlaz kompilacije, SalesMapper.class , ići u direktorij nazvan ovim imenom paketa: SalesCountry .
Nakon toga uvozimo knjižnične pakete.
Ispod Snimak pokazuje implementacija SalesMapper klasno
Objašnjenje uzorka koda:
1. Definicija razreda SalesMapper-
javna klasa SalesMapper proširuje MapReduceBase implementira Mapper
Svaka klasa mappera mora se proširiti iz klase MapReduceBase i mora implementirati Mapper sučelje.
2. Utvrđivanje funkcije 'karte'
public void map(LongWritable key,Text value,OutputCollectoroutput,Reporter reporter) throws IOException
Glavni dio klase Mapper je metoda 'map ()' koja prihvaća četiri argumenta.
Pri svakom pozivu metode 'map ()' prosljeđuje se par ključ / vrijednost ( 'key' i 'value' u ovom kodu).
metoda 'map ()' započinje dijeljenjem ulaznog teksta koji se prima kao argument. Koristi tokenizator da podijeli ove retke u riječi.
String valueString = value.toString();String[] SingleCountryData = valueString.split(",");
Ovdje se ',' koristi kao graničnik.
Nakon toga formira se par pomoću zapisa na 7. indeksu niza 'SingleCountryData' i vrijednosti '1' .
output.collect (novi tekst (SingleCountryData [7]), jedan);
Mi biramo rekord na 7. indeksa, jer moramo Country podatke, a nalazi se na 7. indeksa u nizu „SingleCountryData” .
Napominjemo da su naši ulazni podaci u donjem formatu (gdje je Zemlja na sedmom indeksu, a početni indeks 0) -
Datum_transakcije, Proizvod, Cijena , Vrsta plaćanja, Ime, Grad, Država, Država , Izrađen_račun, Zadnja_Prijava, Latitude, Zemljopisna dužina
Izlaz mappera ponovno je par ključ / vrijednost koji se izvodi metodom 'collect ()' iz 'OutputCollector' .
Objašnjenje klase SalesCountryReducer
U ovom ćemo odjeljku razumjeti implementaciju klase SalesCountryReducer .
1. Započinjemo određivanjem naziva paketa za našu klasu. SalesCountry naziv je out paketa. Imajte na umu da će izlaz kompilacije SalesCountryReducer.class ići u direktorij imenovan ovim imenom paketa: SalesCountry .
Nakon toga uvozimo knjižnične pakete.
Ispod snimke prikazana je implementacija klase SalesCountryReducer-
Objašnjenje koda:
1. Definicija klase SalesCountryReducer-
javna klasa SalesCountryReducer proširuje MapReduceBase implementira reduktor
Ovdje su prva dva tipa podataka, 'Text' i 'IntWritable' vrsta podataka unosa ključ-vrijednost u reduktor.
Izlaz mappera je u obliku
Posljednje dvije vrste podataka, 'Tekst' i 'IntWritable' su vrsta podataka izlaza koje generira reduktor u obliku para ključ / vrijednost.
Svaka klasa reduktora mora se proširiti iz klase MapReduceBase i mora implementirati sučelje reduktora .
2. Definiranje funkcije 'smanjenja'
public void reduce( Text t_key,Iteratorvalues,OutputCollector output,Reporter reporter) throws IOException {
Ulaz u metodu reduce () ključ je s popisom višestrukih vrijednosti.
Na primjer, u našem slučaju to će biti-
Ovo se daje reduktoru kao
Dakle, za prihvaćanje argumenata ovog oblika koriste se prve dvije vrste podataka, naime, Text i Iterator
Sljedeći je argument tipa OutputCollector
metoda reduce () započinje kopiranjem vrijednosti ključa i inicijalizacijom broja frekvencija na 0.
Ključ teksta = t_key; int frekvencijaForCountry = 0;
Zatim, koristeći petlju ' while' , prelistavamo popis vrijednosti pridruženih ključu i izračunavamo konačnu frekvenciju zbrajanjem svih vrijednosti.
while (values.hasNext()) {// replace type of value with the actual type of our valueIntWritable value = (IntWritable) values.next();frequencyForCountry += value.get();}
Sada rezultat gurnemo na izlazni kolektor u obliku ključa i dobivenog broja frekvencija .
Ispod koda to čini-
output.collect(key, new IntWritable(frequencyForCountry));
Objašnjenje klase SalesCountryDriver
U ovom ćemo odjeljku razumjeti implementaciju klase SalesCountryDriver
1. Započinjemo određivanjem naziva paketa za našu klasu. SalesCountry naziv je out paketa. Imajte na umu da će izlaz kompilacije SalesCountryDriver.class ići u direktorij imenovan ovim imenom paketa: SalesCountry .
Ovdje je redak koji navodi naziv paketa praćen kodom za uvoz paketa knjižnice.
2. Definirajte klasu upravljačkog programa koja će stvoriti novi posao klijenta, konfiguracijski objekt i oglašavati Mapper i Reducer klase.
Klasa vozača odgovorna je za postavljanje našeg rada MapReduce da se izvodi u Hadoopu. U ovoj klasi specificiramo naziv posla, vrstu podataka unosa / izlaza i nazive klasa mapiranja i reduktora .
3. U donjem isječku koda postavljamo ulazne i izlazne direktorije koji se koriste za trošenje ulaznog skupa podataka i stvaranje rezultata.
arg [0] i arg [1] su argumenti naredbenog retka koji se prosljeđuju naredbom danom u MapReduce hands-on, tj.
$ HADOOP_HOME / bin / hadoop jar ProductSalePerCountry.jar / inputMapReduce / mapreduce_output_sales
4. Pokrenite naš posao
Ispod početka izvođenja koda MapReduce-
try {// Run the jobJobClient.runJob(job_conf);} catch (Exception e) {e.printStackTrace();}