Hadoop & Primjeri Mapreducea: Stvorite prvi program na Javi

Sadržaj:

Anonim

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:

Podaci SalesJan2009

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,OutputCollector output,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 , . Ovaj izlaz mappera postaje ulaz u reduktor. Dakle, da bi se uskladili s njegovom vrstom podataka, ovdje se kao vrsta podataka koriste Text i IntWritable .

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,Iterator values,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 . Tekst je vrsta podataka ključa, a Iterator vrsta podataka za popis vrijednosti za taj ključ.

Sljedeći je argument tipa OutputCollector koji prikuplja izlaz faze reduktora.

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