Selles õpetuses õpite kasutama Hadoopi MapReduce'i näidetega. Kasutatud sisendandmeteks on SalesJan2009.csv. See sisaldab müügiga seotud teavet, näiteks toote nimi, hind, makseviis, linn, kliendiriik jne. Eesmärk on teada saada müüdud toodete arvu igas riigis.
Selles õpetuses saate teada
- Esimene Hadoop MapReduce programm
- SalesMapperi klassi selgitus
- Salongi SalesCountryReducer selgitus
- Salongi SalesCountryDriver selgitus
Esimene Hadoop MapReduce programm
Nüüd loome selles MapReduce õpetuses oma esimese Java MapReduce programmi:
Veenduge, et Hadoop oleks installitud. Enne tegeliku protsessiga alustamist muutke kasutaja nimeks „hduser” (Hadoopi seadistamise ajal kasutatav ID, saate üle minna oma Hadoopi programmeerimiskonfiguratsiooni ajal kasutatavale kasutajatunnusele).
su - hduser_
Samm 1)
Looge uus kataloog nimega MapReduceTutorial nagu allpool toodud MapReduce näites shwon
sudo mkdir MapReduceTutorial
Andke load
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();}}}
Laadige failid alla siit
Kontrollige kõigi nende failide faililube
ja kui lugemisõigused puuduvad, andke sama
2. samm)
Ekspordi klassirada, nagu on näidatud allpool Hadoopi näites
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. samm)
Kompileerige Java-failid (need failid on kataloogis Final-MapReduceHandsOn ). Selle klassi failid paigutatakse pakettide kataloogi
javac -d . SalesMapper.java SalesCountryReducer.java SalesCountryDriver.java
Seda hoiatust võib julgelt eirata.
Selle kompileerimisega luuakse kataloog praegusesse kataloogi, mille nimi on java lähtefailis määratud paketi nimi (st meie puhul SalesCountry ) ja paneb sinna kõik kompileeritud klassifailid.
4. samm)
Looge uus fail Manifest.txt
sudo gedit Manifest.txt
lisage sellele järgmised read,
Main-Class: SalesCountry.SalesCountryDriver
SalesCountry.SalesCountryDriver on põhiklassi nimi. Pange tähele, et peate selle rea lõpus vajutama sisestusklahvi.
5. samm)
Looge Jar-fail
jar cfm ProductSalePerCountry.jar Manifest.txt SalesCountry/*.class
Kontrollige, kas purgifail on loodud
6. samm)
Käivitage Hadoop
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
7. samm)
Kopeeri Fail SalesJan2009.csv arvesse ~ / inputMapReduce
Nüüd kasutage käsku allpool ~ / inputMapReduce kopeerimiseks HDFS -i.
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal ~/inputMapReduce /
Me võime seda hoiatust ohutult ignoreerida.
Kontrollige, kas fail on tegelikult kopeeritud või mitte.
$HADOOP_HOME/bin/hdfs dfs -ls /inputMapReduce
8. samm)
Käivitage MapReduce töö
$HADOOP_HOME/bin/hadoop jar ProductSalePerCountry.jar /inputMapReduce /mapreduce_output_sales
See loob HDFS-i väljundkataloogi mapreduce_output_sales. Selle kataloogi sisu on fail, mis sisaldab toodete müüki riikide kaupa.
9. samm)
Tulemust saab näha käsuliidese kaudu järgmiselt:
$HADOOP_HOME/bin/hdfs dfs -cat /mapreduce_output_sales/part-00000
Tulemusi saab näha ka veebiliidese kaudu
Avage veebibrauseris r.
Nüüd valige 'Sirvi failisüsteemi' ja navigeerige saidile / mapreduce_output_sales
Avatud osa-r-00000
SalesMapperi klassi selgitus
Selles jaotises mõistame klassi SalesMapper juurutamist .
1. Alustame oma klassi paketi nime määramisega. SalesCountry on meie paketi nimi. Pange tähele, et kompileerimise väljund SalesMapper.class läheb kataloogi, mille nimi on selle paketi nimi: SalesCountry .
Pärast seda impordime raamatukogupakette.
Allpool olev ülevaade näitab SalesMapperi klassi rakendamist
Koodinäidise selgitus:
1. SalesMapperi klassi määratlus-
avaliku klassi SalesMapper laiendab MapReduceBase'i rakendusi Mapper
Iga kaardistaja klassi tuleb laiendada MapReduceBase klassist ja see peab rakendama Mapperi liidese.
2. Kaardi funktsiooni määratlemine-
public void map(LongWritable key,Text value,OutputCollectoroutput,Reporter reporter) throws IOException
Mapperi klassi põhiosa on 'map ()' meetod, mis aktsepteerib nelja argumenti.
Igal meetodil 'map ()' helistamisel edastatakse võtme-väärtuste paar ( selles koodis 'võti' ja 'väärtus' ).
'map ()' meetod algab sisendteksti jagamisega, mis võetakse vastu argumendina. Ta kasutab tokenizerit nende ridade sõnadeks jagamiseks.
String valueString = value.toString();String[] SingleCountryData = valueString.split(",");
Siin kasutatakse eraldajana tähte ',' .
Pärast seda moodustatakse paar, kasutades massiivi "SingleCountryData" 7. indeksis olevat kirjet ja väärtust "1" .
output.collect (uus tekst (SingleCountryData [7]), üks);
Valime rekordi 7. indeksis, kuna meil on vaja riigi andmeid ja see asub massiivi „SingleCountryData” 7. indeksis .
Pange tähele, et meie sisendandmed on allpool formaat (kui riik on 7 th indeks, 0 algmaterjalina indeks) -
Tehingu kuupäev, toode, hind, makse_Tüüp, nimi, linn, osariik, riik , konto_loodud, viimane sisselogimisnumber, laiuskraad, pikkuskraad
Kaardistaja väljund on jällegi võtme-väärtuste paar, mille väljastamiseks kasutatakse meetodi 'OutputCollector' kogumist () .
Salongi SalesCountryReducer selgitus
Selles jaotises mõistame klassi SalesCountryReducer rakendamist .
1. Alustame oma klassi paketi nime määramisega. SalesCountry on välja paketi nimi. Pange tähele, et kompileerimise väljund SalesCountryReducer.class läheb kataloogi, mille nimi on selle paketi nimi: SalesCountry .
Pärast seda impordime raamatukogupakette.
Allpool olev ülevaade näitab rakenduse SalesCountryReducer klassi rakendamist
Koodi selgitus:
1. SalesCountryReducer klassi määratlus-
public class SalesCountryReducer laiendab MapReduceBase'i rakendusi Reducer
Siin on kaks esimest andmetüüpi „Tekst” ja „IntWritable” reduktori sisendvõtme väärtuse andmetüüp.
Kaardistaja väljund on kujul
Kaks viimast andmetüüpi „Tekst” ja „IntWritable” on reduktori genereeritud väljundi andmetüüp võtme-väärtuste paari kujul.
Iga reduktori klassi tuleb laiendada MapReduceBase klassist ja see peab kasutama Reduceri liidest.
2. Funktsiooni "vähendamine" määratlemine
public void reduce( Text t_key,Iteratorvalues,OutputCollector output,Reporter reporter) throws IOException {
Meetodi reduc () sisend on võti, kus on mitu väärtust.
Näiteks meie puhul on
See antakse reduktorile kui
Niisiis, selle vormi argumentide aktsepteerimiseks kasutatakse kahte esimest andmetüüpi, nt Tekst ja Iterator
Järgmine argument on tüüp OutputCollector
meetod vähendada () algab võtme väärtuse kopeerimisest ja sageduste loendamise lähtestamisest 0-ni.
Tekstiklahv = t_key; int frequencyForCountry = 0;
Seejärel kordame silmus ' while' abil võtmega seotud väärtuste loendi kaudu ja arvutame lõpliku sageduse, summeerides kõik väärtused.
while (values.hasNext()) {// replace type of value with the actual type of our valueIntWritable value = (IntWritable) values.next();frequencyForCountry += value.get();}
Nüüd lükkame tulemuse võtme ja saadud sageduste loendina väljundkollektorisse .
Koodi all teeb see-
output.collect(key, new IntWritable(frequencyForCountry));
Salongi SalesCountryDriver selgitus
Selles jaotises mõistame klassi SalesCountryDriver juurutamist
1. Alustame oma klassi paketi nime määramisega. SalesCountry on välja paketi nimi. Pange tähele, et kompileerimise väljund SalesCountryDriver.class läheb kataloogi, mille nimi on selle paketi nimi: SalesCountry .
Siin on rida, mis määrab paketi nime, millele järgneb kood teegipakettide importimiseks.
2. Määratlege draiveriklass, mis loob uue klienditöö, konfiguratsiooniobjekti ning reklaamib Mapperi ja Reduceri klasse.
Juhiklassi ülesanne on seadistada meie MapReduce töö Hadoopis töötama. Selles klassis täpsustame töö nime, sisendi / väljundi andmetüübi ning kaardistaja ja reduktori klasside nimed .
3. Koodijupi all määrame sisend- ja väljundkataloogid, mida kasutatakse vastavalt sisendandmekogumi tarbimiseks ja väljundi tootmiseks.
arg [0] ja arg [1] on käsureaargumendid, mis edastatakse MapReduce käed-käsus antud käsuga, st
$ HADOOP_HOME / bin / hadoop jar ProductSalePerCountry.jar / inputMapReduce / mapreduce_output_sales
4. Käivitage meie töö
Koodi all käivitage MapReduce töö-
try {// Run the jobJobClient.runJob(job_conf);} catch (Exception e) {e.printStackTrace();}