Hadoop & Näited Mapreduce'ist: looge Java-s esimene programm

Lang L: none (table-of-contents):

Anonim

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:

SalesJan2009 andmed

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,OutputCollector output,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 , . See kaardistaja väljund muutub reduktori sisendiks. Seega kasutatakse andmetüübina joondamiseks siin andmetüübina teksti ja IntWritable .

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,Iterator values,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 . Tekst on võtme andmetüüp ja Iterator on selle võtme väärtuste loendi andmetüüp.

Järgmine argument on tüüp OutputCollector , mis kogub reduktori faasi väljundi.

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