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:
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,OutputCollectoroutput,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
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,Iteratorvalues,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
Seuraava argumentti on tyyppiä OutputCollector
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();}