Bu eğitimde, Hadoop'u MapReduce Örnekleriyle birlikte kullanmayı öğreneceksiniz. Kullanılan giriş verisi SalesJan2009.csv'dir. Ürün adı, fiyatı, ödeme modu, şehir, müşterinin ülkesi gibi Satışla ilgili bilgileri içerir. Amaç, Her Ülkede Satılan Ürün Sayısını Bulmaktır.
Bu eğitimde öğreneceksiniz-
- İlk Hadoop MapReduce Programı
- SalesMapper Sınıfının Açıklaması
- SalesCountryReducer Sınıfının Açıklaması
- SalesCountryDriver Sınıfının Açıklaması
İlk Hadoop MapReduce Programı
Şimdi bu MapReduce eğitiminde, ilk Java MapReduce programımızı oluşturacağız:
Hadoop'un kurulu olduğundan emin olun. Gerçek işleme başlamadan önce, kullanıcıyı 'hduser' olarak değiştirin (Hadoop yapılandırmasında kullanılan kimlik, Hadoop programlama yapılandırmanız sırasında kullanılan kullanıcı kimliğine geçebilirsiniz).
su - hduser_
Aşama 1)
Aşağıdaki MapReduce örneğinde shwon olarak MapReduceTutorial adıyla yeni bir dizin oluşturun
sudo mkdir MapReduceTutorial
İzin verin
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();}}}
Dosyaları Buradan İndirin
Tüm bu dosyaların dosya izinlerini kontrol edin
ve 'okuma' izinleri eksikse, aynısını verin-
Adım 2)
Sınıf yolunu aşağıdaki Hadoop örneğinde gösterildiği gibi dışa aktarın
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/*"
Aşama 3)
Java dosyalarını derleyin (bu dosyalar Final-MapReduceHandsOn dizininde bulunur ). Sınıf dosyaları paket dizinine konulacaktır.
javac -d . SalesMapper.java SalesCountryReducer.java SalesCountryDriver.java
Bu uyarı güvenli bir şekilde göz ardı edilebilir.
Bu derleme, java kaynak dosyasında belirtilen paket adıyla (örn . Bizim durumumuzda SalesCountry ) adlandırılan geçerli bir dizinde bir dizin oluşturacak ve tüm derlenmiş sınıf dosyalarını içine koyacaktır.
Adım 4)
Yeni bir dosya Manifest.txt oluşturun
sudo gedit Manifest.txt
ona aşağıdaki satırları ekleyin,
Main-Class: SalesCountry.SalesCountryDriver
SalesCountry.SalesCountryDriver , ana sınıfın adıdır. Lütfen bu satırın sonunda enter tuşuna basmanız gerektiğini unutmayın.
Adım 5)
Jar dosyası oluşturun
jar cfm ProductSalePerCountry.jar Manifest.txt SalesCountry/*.class
Jar dosyasının oluşturulup oluşturulmadığını kontrol edin
Adım 6)
Hadoop'u başlatın
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
Adım 7)
SalesJan2009.csv dosyasını ~ / inputMapReduce içine kopyalayın
Şimdi ~ / inputMapReduce'u HDFS'ye kopyalamak için aşağıdaki komutu kullanın .
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal ~/inputMapReduce /
Bu uyarıyı güvenle görmezden gelebiliriz.
Bir dosyanın gerçekten kopyalanıp kopyalanmadığını doğrulayın.
$HADOOP_HOME/bin/hdfs dfs -ls /inputMapReduce
Adım 8)
MapReduce işini çalıştır
$HADOOP_HOME/bin/hadoop jar ProductSalePerCountry.jar /inputMapReduce /mapreduce_output_sales
Bu, HDFS üzerinde mapreduce_output_sales adlı bir çıktı dizini oluşturacaktır. Bu dizinin içeriği, ülke başına ürün satışlarını içeren bir dosya olacaktır.
Adım 9)
Sonuç, komut arabirimi aracılığıyla şu şekilde görülebilir:
$HADOOP_HOME/bin/hdfs dfs -cat /mapreduce_output_sales/part-00000
Sonuçlar ayrıca bir web arayüzü aracılığıyla da görülebilir.
Bir web tarayıcısında r açın.
Şimdi 'Dosya sistemine gözat'ı seçin ve / mapreduce_output_sales'e gidin
Açık yarı r-00000
SalesMapper Sınıfının Açıklaması
Bu bölümde SalesMapper sınıfının uygulanmasını anlayacağız .
1. Sınıfımız için bir paket adı belirleyerek başlıyoruz. SalesCountry , paketimizin bir adıdır. Derleme çıktısının, SalesMapper.class'ın bu paket adıyla adlandırılan bir dizine gideceğini lütfen unutmayın : SalesCountry .
Bunu takiben kütüphane paketlerini içe aktarıyoruz.
Anlık gösterileri Aşağıda bir uygulama SalesMapper sınıf-
Örnek Kod Açıklaması:
1. SalesMapper Sınıfı Tanımı-
public class SalesMapper, MapReduceBase'i genişletir Mapper
Her mapper sınıfı, MapReduceBase sınıfından genişletilmeli ve Mapper arabirimini uygulamalıdır .
2. 'Harita' işlevinin tanımlanması-
public void map(LongWritable key,Text value,OutputCollectoroutput,Reporter reporter) throws IOException
Mapper sınıfının ana kısmı, dört bağımsız değişkeni kabul eden bir 'map ()' yöntemidir.
'Map ()' yöntemine yapılan her çağrıda , bir anahtar / değer çifti ( bu kodda 'anahtar' ve 'değer' ) iletilir.
'map ()' yöntemi, argüman olarak alınan girdi metnini bölerek başlar. Bu satırları kelimelere ayırmak için jetonlaştırıcıyı kullanır.
String valueString = value.toString();String[] SingleCountryData = valueString.split(",");
Burada ',' sınırlayıcı olarak kullanılır.
Bundan sonra, 'SingleCountryData' dizisinin 7. dizinindeki bir kayıt ve '1' değeri kullanılarak bir çift oluşturulur .
output.collect (yeni Metin (SingleCountryData [7]), bir);
7. indekste kaydı seçiyoruz çünkü Ülke verilerine ihtiyacımız var ve 'SingleCountryData' dizisinde 7. indekste yer alıyor .
Lütfen not bizim veri girişi (aşağıda biçiminde olduğunu Ülke 7'de olduğu inci başlangıç endeks olarak 0 ile, indeks) -
İşlem_tarihi, Ürün, Fiyat, Ödeme_türü, Ad, Şehir, Eyalet, Ülke , Hesap_ Oluşturulan, Son_Login, Enlem, Boylam
Eşleştiricinin bir çıktısı, yine 'OutputCollector' yönteminin 'Collect ()' yöntemi kullanılarak çıktısı alınan bir anahtar-değer çiftidir .
SalesCountryReducer Sınıfının Açıklaması
Bu bölümde SalesCountryReducer sınıfının uygulanmasını anlayacağız .
1. Sınıfımız için paketin bir adını belirleyerek başlıyoruz. SalesCountry , paket dışı paketin adıdır. Derleme çıktısının, SalesCountryReducer.class'ın bu paket adıyla adlandırılan bir dizine gideceğini lütfen unutmayın : SalesCountry .
Bunu takiben kütüphane paketlerini içe aktarıyoruz.
Anlık gösterileri Aşağıda bir uygulama SalesCountryReducer sınıf-
Kod Açıklaması:
1. SalesCountryReducer Sınıfı Tanımı-
public class SalesCountryReducer, MapReduceBase uygulamalarını genişletir Reducer
Burada, ilk iki veri türü, 'Metin' ve 'IntWritable' , indirgeyiciye giriş anahtar / değer çiftinin veri türüdür.
Eşleyicinin çıktısı <ÜlkeAdı1, 1>, <ÜlkeAdı2, 1> biçimindedir. Eşleştiricinin bu çıkışı, indirgeyiciye girdi olur. Bu nedenle, veri türüyle uyum sağlamak için, burada veri türü olarak Metin ve IntWritable kullanılır.
Son iki veri türü, 'Metin' ve 'Yazılabilir', anahtar / değer çifti biçiminde indirgeyici tarafından oluşturulan veri çıktı türüdür.
Her indirgeyici sınıfı, MapReduceBase sınıfından genişletilmeli ve Reducer arabirimini uygulamalıdır .
2. 'Azalt' işlevinin tanımlanması-
public void reduce( Text t_key,Iteratorvalues,OutputCollector output,Reporter reporter) throws IOException {
Azalt () yöntemine bir girdi , birden çok değerden oluşan bir listeye sahip bir anahtardır.
Örneğin, bizim durumumuzda, bu ...
Redüktöre
Dolayısıyla, bu formun argümanlarını kabul etmek için ilk iki veri türü kullanılır, yani Metin ve Yineleyici
Sonraki argüman, indirgeyici fazın çıktısını toplayan OutputCollector
azaltma () yöntemi, anahtar değerinin kopyalanması ve frekans sayımının 0 olarak başlatılmasıyla başlar.
Metin anahtarı = t_key; int FrequencyForCountry = 0;
Ardından, ' while' döngüsünü kullanarak , anahtarla ilişkili değerler listesini yineleriz ve tüm değerleri toplayarak son frekansı hesaplarız.
while (values.hasNext()) {// replace type of value with the actual type of our valueIntWritable value = (IntWritable) values.next();frequencyForCountry += value.get();}
Şimdi sonucu çıkış toplayıcıya anahtar şeklinde itiyoruz ve elde edilen frekans sayımı yapıyoruz .
Aşağıdaki kod bunu yapar-
output.collect(key, new IntWritable(frequencyForCountry));
SalesCountryDriver Sınıfının Açıklaması
Bu bölümde, SalesCountryDriver sınıfının uygulanmasını anlayacağız.
1. Sınıfımız için bir paket adı belirleyerek başlıyoruz. SalesCountry , paket dışı paketin adıdır. Derleme çıktısının, SalesCountryDriver.class'ın bu paket adıyla adlandırılan dizine gideceğini lütfen unutmayın : SalesCountry .
Burada, paket adını ve ardından kitaplık paketlerini içe aktarmak için kodu belirten bir satır var.
2. Yeni bir istemci işi, yapılandırma nesnesi yaratacak ve Mapper ve Reducer sınıflarını tanıtacak bir sürücü sınıfı tanımlayın.
Sürücü sınıfı, MapReduce işimizi Hadoop'ta çalışacak şekilde ayarlamaktan sorumludur. Bu sınıfta, iş adını, girdi / çıktı veri türünü ve eşleyici ve indirgeyici sınıflarının adlarını belirtiyoruz .
3. Aşağıdaki kod parçacığında, sırasıyla girdi veri kümesini tüketmek ve çıktı üretmek için kullanılan girdi ve çıktı dizinlerini belirledik.
arg [0] ve arg [1] , MapReduce uygulamalı olarak verilen bir komutla iletilen komut satırı argümanlarıdır.
$ HADOOP_HOME / bin / hadoop jar ProductSalePerCountry.jar / inputMapReduce / mapreduce_output_sales
4. İşimizi tetikleyin
Kodun altında MapReduce işinin yürütülmesine başla-
try {// Run the jobJobClient.runJob(job_conf);} catch (Exception e) {e.printStackTrace();}