Хадооп & амп; Примери Мапредуце-а: Направите први програм на Јави

Преглед садржаја:

Anonim

У овом упутству ћете научити да користите Хадооп са примерима МапРедуце. Улазни подаци који се користе су СалесЈан2009.цсв. Садржи информације везане за продају, као што су назив производа, цена, начин плаћања, град, држава клијента итд. Циљ је сазнати број производа који се продају у свакој земљи.

У овом упутству ћете научити-

  • Први програм Хадооп МапРедуце
  • Објашњење класе СалесМаппер
  • Објашњење класе СалесЦоунтриРедуцер
  • Објашњење класе СалесЦоунтриДривер

Први програм Хадооп МапРедуце

Сада ћемо у овом упутству за МапРедуце створити наш први програм Јава МапРедуце:

Подаци СалесЈан2009

Обавезно инсталирајте Хадооп. Пре него што започнете са стварним процесом, промените корисника у 'хдусер' (ид који се користи током конфигурације Хадооп-а, можете да пређете на кориснички број који се користи током ваше конфигурације Хадооп програмирања).

su - hduser_

Корак 1)

Направите нови директоријум са именом МапРедуцеТуториал као схвон у доњем примеру МапРедуце

sudo mkdir MapReduceTutorial

Дајте дозволе

sudo chmod -R 777 MapReduceTutorial

СалесМаппер.јава

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

СалесЦоунтриРедуцер.јава

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

СалесЦоунтриДривер.јава

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

Преузмите датотеке овде

Проверите дозволе за датотеке свих ових датотека

а ако недостају дозволе за читање, доделите исто-

Корак 2)

Извезите пут до класе као што је приказано у доњем примеру Хадооп-а

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)

Саставите Јава датотеке (ове датотеке су присутне у директоријуму Финал-МапРедуцеХандсОн ). Датотеке класе ће бити стављене у директоријум пакета

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

Ово упозорење се може сигурно игнорисати.

Ова компилација ће створити директоријум у тренутном директоријуму названом именом пакета наведеним у јава изворној датотеци (тј. СалесЦоунтри у нашем случају) и у њу ставити све компајлиране датотеке класе.

Корак 4)

Направите нову датотеку Манифест.ткт

sudo gedit Manifest.txt

додајте му следеће редове,

Main-Class: SalesCountry.SalesCountryDriver

СалесЦоунтри.СалесЦоунтриДривер је име главне класе. Имајте на уму да морате притиснути тастер ентер на крају овог ретка.

Корак 5)

Направите Јар датотеку

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

Проверите да ли је датотека јар креирана

Корак 6)

Покрените Хадооп

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

Корак 7)

Копирајте датотеку СалесЈан2009.цсв у ~ / инпутМапРедуце

Сада Користите доњу наредбу за копирање ~ / инпутМапРедуце на ХДФС.

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

Ово упозорење можемо сигурно игнорисати.

Проверите да ли је датотека стварно копирана или не.

$HADOOP_HOME/bin/hdfs dfs -ls /inputMapReduce

Корак 8)

Покрените МапРедуце посао

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

Ово ће створити излазни директоријум под називом мапредуце_оутпут_салес на ХДФС-у. Садржај овог директоријума биће датотека која садржи продају производа по земљама.

Корак 9)

Резултат се кроз командни интерфејс може видети као,

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

Резултати се такође могу видети путем веб интерфејса као

Отворите р у веб прегледачу.

Сада изаберите „Прегледај систем датотека“ и идите до / мапредуце_оутпут_салес

Отворени део-р-00000

Објашњење класе СалесМаппер

У овом одељку ћемо разумети примену класе СалесМаппер .

1. Почињемо навођењем назива пакета за нашу класу. СалесЦоунтри је назив нашег пакета. Имајте на уму да ће излаз компилације, СалесМаппер.цласс , ићи у директоријум назван овим именом пакета: СалесЦоунтри .

Након тога, увозимо библиотечке пакете.

Испод снапсхот емисија имплементација СалесМаппер учионици

Објашњење узорка кода:

1. Дефиниција класе СалесМаппер-

јавна класа СалесМаппер проширује МапРедуцеБасе имплементира Маппер <ЛонгВритабле, Тект, Тект, ИнтВритабле> {

Свака класа маппер мора бити проширена из класе МапРедуцеБасе и мора имплементирати Маппер интерфејс.

2. Дефинисање функције 'мапе'

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

Главни део класе Маппер је метода 'мап ()' која прихвата четири аргумента.

При сваком позиву методе 'мап ()' прослеђује се пар кључ / вредност ( 'кеи' и 'валуе' у овом коду).

Метода 'мап ()' започиње раздвајањем улазног текста који се прима као аргумент. Користи токенизатор да раздвоји ове редове у речи.

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

Овде се „,“ користи као граничник.

Након тога, пар се формира помоћу записа на 7. индексу низа „СинглеЦоунтриДата“ и вредности „1“ .

оутпут.цоллецт (нови текст (СинглеЦоунтриДата [7]), један);

Бирамо рекорд на 7. индексу, јер нам је потребна Страна подаци и налази се на 7. индекс у низу 'СинглеЦоунтриДата' .

Имајте на уму да су наши улазни подаци у доњем формату (где је Земља на седмом индексу, а 0 као почетни индекс) -

Датум_трансакције, Производ, Цена, Тип_плаћања, Име, Град, Држава, Држава , Створен_налог, Последња_Логин, Латитуде, Дужина

Излаз маппера је поново пар кључ / вредност који се изводи методом 'цоллецт ()' из 'ОутпутЦоллецтор' .

Објашњење класе СалесЦоунтриРедуцер

У овом одељку ћемо разумети примену класе СалесЦоунтриРедуцер .

1. Почињемо навођењем назива пакета за нашу класу. СалесЦоунтри је назив оут пакета. Имајте на уму да ће излаз компилације, СалесЦоунтриРедуцер.цласс , ићи у директоријум именован овим именом пакета: СалесЦоунтри .

Након тога, увозимо библиотечке пакете.

Испод снапсхот емисија имплементација СалесЦоунтриРедуцер учионици

Објашњење кода:

1. Дефиниција класе СалесЦоунтриРедуцер-

јавна класа СалесЦоунтриРедуцер проширује МапРедуцеБасе имплементира редуктор <Тект, ИнтВритабле, Тект, ИнтВритабле> {

Овде су прва два типа података, 'Тект' и 'ИнтВритабле' тип података који уносе кључ / вредност у редуктор.

Излаз маппер-а је у облику <ЦоунтриНаме1, 1>, <ЦоунтриНаме2, 1>. Овај излаз маппера постаје улаз у редуктор. Дакле, да би се поравнали са његовим типом података, овде се као тип података користе Тект и ИнтВритабле .

Последња два типа података, 'Текст' и 'ИнтВритабле' су тип података који се генерише редуктором у облику пара кључ / вредност.

Свака класа редуктора мора бити проширена из класе МапРедуцеБасе и мора имплементирати интерфејс редуктора .

2. Дефинисање функције „смањења“ -

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

Улаз у методу редуце () је кључ са листом више вредности.

На пример, у нашем случају, биће-

<Уједињени Арапски Емирати, 1>, <Уједињени Арапски Емирати, 1>, <Уједињени Арапски Емирати, 1>, <Уједињени Арапски Емирати, 1>, <Уједињени Арапски Емирати, 1>, <Уједињени Арапски Емирати, 1>.

Ово се даје редуктору као <Уједињени Арапски Емирати, {1,1,1,1,1,1}>

Дакле, да би се прихватили аргументи овог облика, користе се прва два типа података, наиме, Тект и Итератор <ИнтВритабле> . Текст је тип података кључа, а Итератор <ИнтВритабле> је тип података за листу вредности за тај кључ.

Следећи аргумент је типа ОутпутЦоллецтор <Тект, ИнтВритабле> који сакупља излаз фазе редуктора.

метода смањи () започиње копирањем вредности кључа и иницијализацијом броја фреквенција на 0.

Кључ текста = т_кеи; инт фрекуенциФорЦоунтри = 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));

Објашњење класе СалесЦоунтриДривер

У овом одељку ћемо разумети примену класе СалесЦоунтриДривер

1. Почињемо навођењем назива пакета за нашу класу. СалесЦоунтри је назив оут пакета. Имајте на уму да ће излаз компилације, СалесЦоунтриДривер.цласс , ићи у директоријум именован овим именом пакета: СалесЦоунтри .

Овде је линија која специфицира име пакета праћено кодом за увоз пакета библиотека.

2. Дефинишите класу управљачког програма која ће створити нови посао клијента, објекат конфигурације и оглашавати класе Маппер и Редуцер.

Класа возача је одговорна за постављање нашег МапРедуце задатка за покретање у Хадооп-у. У овој класи специфицирамо име посла, тип података уноса / излаза и имена класа мапирања и редуктора .

3. У доњем исечку кода постављамо улазне и излазне директоријуме који се користе за трошење улазног скупа података и производњу резултата.

арг [0] и арг [1] су аргументи командне линије прослеђени командом датом у МапРедуце хандс-он, тј.

$ ХАДООП_ХОМЕ / бин / хадооп јар ПродуцтСалеПерЦоунтри.јар / инпутМапРедуце / мапредуце_оутпут_салес

4. Покрените наш посао

Испод започињања извршавања МапРедуце посла-

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