Šajā apmācībā jūs iemācīsities izmantot Hadoop ar MapReduce piemēriem. Izmantotie ievades dati ir SalesJan2009.csv. Tajā ir ietverta ar pārdošanu saistīta informācija, piemēram, produkta nosaukums, cena, maksājuma režīms, pilsēta, klienta valsts utt. Mērķis ir uzzināt katrā valstī pārdoto produktu skaitu.
Šajā apmācībā jūs uzzināsiet
- Pirmā Hadoop MapReduce programma
- SalesMapper klases skaidrojums
- SalesCountryReducer klases skaidrojums
- SalesCountryDriver klases skaidrojums
Pirmā Hadoop MapReduce programma
Tagad šajā MapReduce apmācībā mēs izveidosim savu pirmo Java MapReduce programmu:
Pārliecinieties, vai esat instalējis Hadoop. Pirms sākat faktisko procesu, nomainiet lietotāju uz “hduser” (ID tiek izmantots, kamēr konfigurējat Hadoop, varat pārslēgties uz lietotāja ID, kas tika izmantots jūsu Hadoop programmēšanas konfigurācijas laikā).
su - hduser_
1. darbība)
Izveidojiet jaunu direktoriju ar nosaukumu MapReduceTutorial kā shwon zemāk esošajā MapReduce piemērā
sudo mkdir MapReduceTutorial
Piešķiriet atļaujas
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();}}}
Lejupielādējiet failus šeit
Pārbaudiet visu šo failu atļaujas
un, ja trūkst “lasīšanas” atļauju, piešķiriet to pašu
2. solis)
Eksportēt klases ceļu, kā parādīts zemāk esošajā Hadoop piemērā
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. solis)
Kompilējiet Java failus (šie faili atrodas direktorijā Final-MapReduceHandsOn ). Tās klases faili tiks ievietoti pakotņu direktorijā
javac -d . SalesMapper.java SalesCountryReducer.java SalesCountryDriver.java
Šo brīdinājumu var droši ignorēt.
Šis apkopojums izveidos direktoriju pašreizējā direktorijā ar nosaukumu pakas nosaukums, kas norādīts Java avota failā (ti , mūsu gadījumā - SalesCountry ), un tajā ievietos visus apkopotos klases failus.
4. solis)
Izveidojiet jaunu failu Manifest.txt
sudo gedit Manifest.txt
pievienojiet tai šādas rindas,
Main-Class: SalesCountry.SalesCountryDriver
SalesCountry.SalesCountryDriver ir galvenās klases nosaukums. Lūdzu, ņemiet vērā, ka šīs rindas beigās ir jānospiež ievadīšanas taustiņš.
5. solis)
Izveidojiet Jar failu
jar cfm ProductSalePerCountry.jar Manifest.txt SalesCountry/*.class
Pārbaudiet, vai burka fails ir izveidots
6. solis)
Sāciet Hadoop
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
7. solis)
Kopēt failu SalesJan2009.csv uz ~ / inputMapReduce
Tagad izmantojiet komandu zemāk, lai kopētu ~ / inputMapReduce uz HDFS.
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal ~/inputMapReduce /
Mēs varam droši ignorēt šo brīdinājumu.
Pārbaudiet, vai fails tiešām tiek kopēts.
$HADOOP_HOME/bin/hdfs dfs -ls /inputMapReduce
8. solis)
Palaidiet MapReduce darbu
$HADOOP_HOME/bin/hadoop jar ProductSalePerCountry.jar /inputMapReduce /mapreduce_output_sales
Tas HDFS izveidos izvades direktoriju mapreduce_output_sales. Šajā direktorijā būs fails, kurā būs produktu pārdošana katrā valstī.
9. solis)
Rezultātu var redzēt, izmantojot komandu interfeisu,
$HADOOP_HOME/bin/hdfs dfs -cat /mapreduce_output_sales/part-00000
Rezultātus var redzēt arī caur tīmekļa saskarni
Atveriet r tīmekļa pārlūkprogrammā.
Tagad atlasiet “Pārlūkot failu sistēmu” un dodieties uz / mapreduce_output_sales
Atvērt daļu r-00000
SalesMapper klases skaidrojums
Šajā sadaļā mēs sapratīsim SalesMapper klases ieviešanu.
1. Sākumā mēs norādām paketes nosaukumu savai klasei. SalesCountry ir mūsu paketes nosaukums. Lūdzu, ņemiet vērā, ka kompilācijas produkcija SalesMapper.class nonāks direktorijā ar nosaukumu šāds pakotnes nosaukums: SalesCountry .
Pēc tam mēs importējam bibliotēkas paketes.
Zemāk esošajā momentuzņēmumā parādīta SalesMapper klases ieviešana
Koda parauga skaidrojums:
1. SalesMapper klases definīcija
public class SalesMapper paplašina MapReduceBase ieviešanu Mapper
Katra kartētāja klase ir jāpaplašina no MapReduceBase klases, un tai jāievieš Mapper saskarne.
2. Funkcijas “karte” definēšana
public void map(LongWritable key,Text value,OutputCollectoroutput,Reporter reporter) throws IOException
Mapper klases galvenā daļa ir “map ()” metode, kas pieņem četrus argumentus.
Pie katras aicinājums "karte ()" metodi, atslēgu vērtību pāri ( "atslēga" un "vērtība" , kas šo kodu), ir pagājis.
Metode 'map ()' sākas, sadalot ievades tekstu, kas tiek saņemts kā arguments. Tas izmanto marķieri, lai šīs rindas sadalītu vārdos.
String valueString = value.toString();String[] SingleCountryData = valueString.split(",");
Šeit kā atdalītājs tiek izmantots ',' .
Pēc tam tiek izveidots pāris, izmantojot ierakstu masīva “SingleCountryData” 7. indeksā un vērtību “1” .
output.collect (jauns teksts (SingleCountryData [7]), viens);
Mēs izvēlamies ierakstu 7. indeksā, jo mums ir nepieciešami valsts dati, un tas atrodas masīva “SingleCountryData” 7. indeksā .
Lūdzu, ņemiet vērā, ka mūsu ievades dati ir zemāk formātā (ja Valsts ir 7 th indekss, ar 0 kā sākuma indekss) -
Darījuma_datums, produkts, cena, maksājuma veids, nosaukums, pilsēta, štats, valsts , konta_izveidots, pēdējais pieteikšanās, platums, garums
Kartētāja izeja atkal ir atslēgu un vērtību pāris, kas tiek izvadīts, izmantojot “OutputCollector” metodi “collect () ” .
SalesCountryReducer klases skaidrojums
Šajā sadaļā mēs sapratīsim SalesCountryReducer klases ieviešanu.
1. Sākumā mēs norādām paketes nosaukumu savai klasei. SalesCountry ir ārpus paketes nosaukums. Lūdzu, ņemiet vērā, ka kompilācijas produkcija SalesCountryReducer.class nonāks direktorijā ar nosaukumu šāds pakotnes nosaukums: SalesCountry .
Pēc tam mēs importējam bibliotēkas paketes.
Zemāk esošajā momentuzņēmumā parādīta SalesCountryReducer klases ieviešana
Koda skaidrojums:
1. SalesCountryReducer klases definīcija
public class SalesCountryReducer paplašina MapReduceBase īstenotos reduktorus
Pirmie divi datu tipi “Teksts” un “IntWritable” ir reduktora ievades atslēgas vērtības datu tips.
Kartētāja rezultāts ir
Pēdējie divi datu tipi “Teksts” un “IntWritable” ir reduktora ģenerētās izvades datu tips atslēgas vērtību pāra formā.
Katra reduktora klase jāpaplašina no MapReduceBase klases, un tai jāievieš Reducer saskarne.
2. Funkcijas “samazināt” definēšana
public void reduce( Text t_key,Iteratorvalues,OutputCollector output,Reporter reporter) throws IOException {
Metodes reducēt () ievadīšana ir atslēga ar vairāku vērtību sarakstu.
Piemēram, mūsu gadījumā tas būs
Tas tiek piešķirts reduktoram kā
Tātad, lai pieņemtu šīs formas argumentus, tiek izmantoti pirmie divi datu tipi, ti, Teksts un Iterator
Nākamais arguments ir OutputCollector
samazināt () metode sākas ar atslēgas vērtības kopēšanu un frekvenču skaita inicializēšanu līdz 0.
Teksta atslēga = t_key; int frequencyForCountry = 0;
Pēc tam, izmantojot cilpu ' while' , mēs atkārtojam ar atslēgu saistīto vērtību sarakstu un aprēķinām galīgo frekvenci, summējot visas vērtības.
while (values.hasNext()) {// replace type of value with the actual type of our valueIntWritable value = (IntWritable) values.next();frequencyForCountry += value.get();}
Tagad mēs nospiežam rezultātu uz izejas kolektoru atslēgas un iegūtā frekvences skaita veidā .
Zem koda to dara
output.collect(key, new IntWritable(frequencyForCountry));
SalesCountryDriver klases skaidrojums
Šajā sadaļā mēs sapratīsim SalesCountryDriver klases ieviešanu
1. Sākumā mēs norādām paketes nosaukumu savai klasei. SalesCountry ir ārpus paketes nosaukums. Lūdzu, ņemiet vērā, ka kompilācijas produkcija SalesCountryDriver.class nonāks direktorijā ar nosaukumu šāds pakotnes nosaukums: SalesCountry .
Šeit ir rinda, kurā norādīts pakotnes nosaukums, kam seko kods, lai importētu bibliotēkas paketes.
2. Definējiet draivera klasi, kas izveidos jaunu klienta darbu, konfigurācijas objektu, un reklamēs Mapper un Reducer klases.
Autovadītāju klase ir atbildīga par mūsu MapReduce darba iestatīšanu darbam Hadoop. Šajā klasē mēs norādām darba nosaukumu, ievades / izvades datu tipu un kartētāja un reduktora klases nosaukumus .
3. Zem koda fragmenta mēs iestatām ievades un izvades direktorijus, kas tiek izmantoti, lai attiecīgi patērētu ievades datu kopu un izveidotu izvadi.
arg [0] un arg [1] ir komandrindas argumenti, kas nodoti, izmantojot komandu, kas dota MapReduce praktiskajā, ti
$ HADOOP_HOME / bin / hadoop jar ProductSalePerCountry.jar / inputMapReduce / mapreduce_output_sales
4. Izraisiet mūsu darbu
Zem koda sāciet MapReduce darba izpildi
try {// Run the jobJobClient.runJob(job_conf);} catch (Exception e) {e.printStackTrace();}