Hadoop & Mapreduce-esimerkkejä: Luo ensimmäinen ohjelma Java-sovelluksessa

Sisällysluettelo:

Anonim

Tässä opetusohjelmassa opit käyttämään Hadoopia MapReduce-esimerkkien kanssa. Käytetty syötetieto on SalesJan2009.csv. Se sisältää myyntiin liittyviä tietoja, kuten tuotteen nimi, hinta, maksutapa, kaupunki, asiakasmaa jne. Tavoitteena on selvittää myytyjen tuotteiden määrä kussakin maassa.

Tässä opetusohjelmassa opit-

  • Ensimmäinen Hadoop MapReduce -ohjelma
  • Selitys SalesMapper-luokalle
  • Selitys SalesCountryReducer-luokalle
  • Selitys SalesCountryDriver-luokalle

Ensimmäinen Hadoop MapReduce -ohjelma

Nyt tässä MapReduce-opetusohjelmassa luomme ensimmäisen Java MapReduce -ohjelmamme:

Myynnin tiedotJan2009

Varmista, että olet asentanut Hadoopin. Ennen kuin aloitat varsinaisen prosessin, vaihda käyttäjä muotoon 'hduser' (Hadoop-määrityksen aikana käytetty tunnus), voit vaihtaa Hadoop-ohjelmointiasetusten aikana käytettyyn käyttäjätunnukseen).

su - hduser_

Vaihe 1)

Luo uusi hakemisto nimellä MapReduceTutorial nimellä shwon alla olevaan MapReduce-esimerkkiin

sudo mkdir MapReduceTutorial

Anna käyttöoikeudet

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

Lataa tiedostot täältä

Tarkista kaikkien näiden tiedostojen käyttöoikeudet

ja jos 'lukuoikeudet puuttuvat, myönnä samat

Vaihe 2)

Vie luokkatie alla olevan Hadoop-esimerkin mukaisesti

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

Vaihe 3)

Käännä Java-tiedostot (nämä tiedostot ovat hakemistossa Final-MapReduceHandsOn ). Sen luokan tiedostot sijoitetaan pakettihakemistoon

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

Tämä varoitus voidaan ohittaa turvallisesti.

Tämä kokoelma luo hakemiston nykyiseen hakemistoon, jonka nimi on Java-lähdetiedostossa määritetty paketin nimi (ts. Tapauksessamme SalesCountry ), ja laittaa siihen kaikki käännetyt luokkatiedostot.

Vaihe 4)

Luo uusi tiedosto Manifest.txt

sudo gedit Manifest.txt

lisää siihen seuraavat rivit,

Main-Class: SalesCountry.SalesCountryDriver

SalesCountry.SalesCountryDriver on pääluokan nimi. Huomaa, että sinun on painettava Enter-näppäintä tämän rivin lopussa.

Vaihe 5)

Luo Jar-tiedosto

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

Tarkista, että jar-tiedosto on luotu

Vaihe 6)

Käynnistä Hadoop

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

Vaihe 7)

Kopioi tiedosto SalesJan2009.csv osaksi ~ / inputMapReduce

Käytä nyt alla olevaa komentoa kopioidaksesi ~ / inputMapReduce HDFS: ään.

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

Voimme ohittaa tämän varoituksen turvallisesti.

Tarkista, kopioidaanko tiedosto todella.

$HADOOP_HOME/bin/hdfs dfs -ls /inputMapReduce

Vaihe 8)

Suorita MapReduce-työ

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

Tämä luo tulostushakemiston nimeltä mapreduce_output_sales HDFS: lle. Tämän hakemiston sisältö on tiedosto, joka sisältää tuotemyynnin maittain.

Vaihe 9)

Tulos voidaan nähdä komentorajapinnan kautta,

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

Tulokset voidaan nähdä myös web-käyttöliittymän kautta

Avaa r verkkoselaimessa.

Valitse nyt 'Selaa tiedostojärjestelmää' ja siirry kohtaan / mapreduce_output_sales

Avoin osa-r-00000

Selitys SalesMapper-luokalle

Tässä osassa ymmärretään SalesMapper- luokan toteutus .

1. Aloitamme määrittelemällä luokalle paketin nimi. SalesCountry on pakettimme nimi. Huomaa, että kokoamisen tulos SalesMapper.class menee hakemistoon, jonka nimi on tämä paketin nimi: SalesCountry .

Tämän seurauksena tuomme kirjastopaketteja.

Alla oleva tilannekuva näyttää SalesMapper class-

Esimerkkikoodin selitys:

1. SalesMapper-luokan määritelmä-

public class SalesMapper laajentaa MapReduceBase-sovelluksia Mapper {

Jokainen mapper-luokka on laajennettava MapReduceBase- luokasta ja sen on toteutettava Mapper- käyttöliittymä.

2. Karttatoiminnon määrittely-

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

Mapper-luokan pääosa on 'map ()' - menetelmä, joka hyväksyy neljä argumenttia.

Jokaisella 'map ()' -menetelmän kutsulla välitetään avain-arvo- pari ( 'avain' ja 'arvo' tässä koodissa).

'map ()' -menetelmä alkaa jakamalla syötteen teksti, joka vastaanotetaan argumenttina. Se käyttää tokenisaattoria jakamaan nämä rivit sanoiksi.

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

Tässä ',' käytetään erottimena.

Tämän jälkeen muodostetaan pari käyttäen ennätystä taulukon 7. indeksissä 'SingleCountryData' ja arvolla '1' .

output.collect (uusi teksti (SingleCountryData [7]), yksi);

Valitsemme tietueen 7. hakemistosta, koska tarvitsemme maakohtaisia tietoja ja se sijaitsee taulukon 7. SingleCountryData taulukossa .

Huomaa, että lähtötiedot on alle muodossa (jossa maa on 7 th indeksi, jossa 0 aloitussymbolipaikaksi index) -

Tapahtuman päivämäärä, tuote, hinta, maksun_tyyppi, nimi, kaupunki, osavaltio, maa , tili luotu, viimeinen kirjautumistunnus, leveysaste, pituusaste

Mapperin lähtö on jälleen avain-arvo- pari, joka tuotetaan käyttämällä 'OutputCollector' -menetelmää 'collect () ' .

Selitys SalesCountryReducer-luokalle

Tässä osassa ymmärretään SalesCountryReducer- luokan toteutus .

1. Aloitetaan määrittämällä paketin nimi luokallemme. SalesCountry on paketin nimi. Huomaa, että kokoamisen tulos SalesCountryReducer.class menee hakemistoon, jonka nimi on tämä paketin nimi: SalesCountry .

Tämän seurauksena tuomme kirjastopaketteja.

Alla oleva tilannekuva näyttää SalesCountryReducer- luokan toteutuksen

Koodin selitys:

1. SalesCountryReducer-luokan määritelmä-

public class SalesCountryReducer laajentaa MapReduceBase-työkaluja Reducer {

Tässä kaksi ensimmäistä tietotyyppiä, "Teksti" ja "IntWritable", ovat pienentimen syöttöavaimen arvon tietotyyppi.

Mapperin tulos on muodossa , . Tämä mapper-tulos tulee syötteeksi vähennysventtiilille. Joten tietotyypin mukauttamiseksi tässä käytetään tietotyyppinä Teksti ja IntWritable .

Kaksi viimeistä tietotyyppiä, 'Teksti' ja 'IntWritable', ovat vähennysventtiilin tuottamia tuotetyyppejä avain-arvo-parin muodossa.

Jokainen reduktoriluokka on laajennettava MapReduceBase- luokasta ja sen on toteutettava Reducer- liitäntä.

2. 'Vähennä' -toiminnon määrittely-

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

Syöttö reduc () -menetelmään on avain, jossa on luettelo useista arvoista.

Esimerkiksi meidän tapauksessamme

, , , , , .

Tämä annetaan vähennysventtiilille muodossa

Joten tämän muodon argumenttien hyväksymiseksi käytetään kahta ensimmäistä tietotyyppiä, eli Teksti ja Iterator . Teksti on avaimen tietotyyppi ja Iterator on tietotyyppi kyseisen avaimen arvoluettelolle.

Seuraava argumentti on tyyppiä OutputCollector , joka kerää vähennysvaiheen lähdön.

vähentää () -menetelmä alkaa kopioimalla avaimen arvo ja alustamalla taajuusluku 0: een.

Tekstiavain = t_key; int frequencyForCountry = 0;

Sitten iteroimme ' while' -silmukan avulla avaimeen liittyvän arvoluettelon läpi ja laskemme lopullisen taajuuden summaamalla kaikki arvot.

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

Nyt työnnämme tuloksen ulostulokerääjälle avaimen ja saadun taajuuslaskun muodossa .

Koodin alla tämä tapahtuu-

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

Selitys SalesCountryDriver-luokalle

Tässä osassa ymmärretään SalesCountryDriver- luokan toteutus

1. Aloitamme määrittelemällä luokalle paketin nimi. SalesCountry on paketin nimi. Huomaa, että kokoamisen tulos SalesCountryDriver.class menee hakemistoon, jonka nimi on tämä paketin nimi: SalesCountry .

Tässä on rivi, joka määrittää paketin nimen ja sen jälkeen koodin kirjastopakettien tuontia varten.

2. Määritä ohjainluokka, joka luo uuden asiakastyön, kokoonpanoobjektin, ja mainosta Mapper- ja Reducer-luokkia.

Kuljettajaluokka on vastuussa MapReduce-työmme asettamisesta suoritettavaksi Hadoopissa. Tässä luokassa määritämme työn nimen, syötteen / lähdön tietotyypin sekä mapper- ja reduktoriluokkien nimet .

3. Alla olevassa koodinpätkässä asetetaan syöttö- ja lähtöhakemistot, joita käytetään vastaavasti syötetietojoukon kulutukseen ja tuotoksen tuottamiseen.

arg [0] ja arg [1] ovat komentoriviargumentit, jotka välitetään MapReduce-käytännön avulla annetulla komennolla, ts.

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

4. Käynnistä työ

Koodin alapuolella aloita MapReduce job-

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