Hadoop ve Mapreduce Örnekleri: İlk Programı Oluşturun Java
Bu eğitimde Hadoop'u MapReduce Örnekleriyle kullanmayı öğreneceksiniz. Kullanılan giriş verileri: SatışOcak2009.csv. Ürün adı, fiyat, ödeme şekli, müşterinin şehri, ülkesi vb. gibi Satışla ilgili bilgileri içerir. Amaç, Her Ülkede Satılan Ürün Sayısını Öğrenin.
İlk Hadoop MapReduce Programı
Şimdi bunda MapReduce öğreticisi, ilkimizi yaratacağız Java MapReduce programı:
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ı sırasında kullanılan kimlik, Hadoop programlama yapılandırmanız sırasında kullanılan kullanıcı kimliğine geçebilirsiniz).
su - hduser_
) 1 Adım
Adıyla yeni bir dizin oluşturun HaritaReduceEğitim aşağıdaki MapReduce örneğinde gösterildiği gibi
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 <LongWritable, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); public void map(LongWritable key, Text value, OutputCollector <Text, IntWritable> 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<Text, IntWritable, Text, IntWritable> { public void reduce(Text t_key, Iterator<IntWritable> values, OutputCollector<Text,IntWritable> 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 value IntWritable 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 job JobConf job_conf = new JobConf(SalesCountryDriver.class); // Set a name of the Job job_conf.setJobName("SalePerCountry"); // Specify data type of output key and value job_conf.setOutputKeyClass(Text.class); job_conf.setOutputValueClass(IntWritable.class); // Specify names of Mapper and Reducer Class job_conf.setMapperClass(SalesCountry.SalesMapper.class); job_conf.setReducerClass(SalesCountry.SalesCountryReducer.class); // Specify formats of the data type of Input and output job_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 job JobClient.runJob(job_conf); } catch (Exception e) { e.printStackTrace(); } } }
Tüm bu dosyaların dosya izinlerini kontrol edin
ve eğer 'okuma' izinleri eksikse aynısını verin.
) 2 Adım
Aşağıdaki Hadoop örneğinde gösterildiği gibi sınıf yolunu 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/*"
) 3 Adım
Derlemek Java dosyalar (bu dosyalar dizinde mevcuttur) Final-MapReduceHandsOn). Sınıf dosyaları paket dizinine konulacaktır
javac -d . SalesMapper.java SalesCountryReducer.java SalesCountryDriver.java
Bu uyarı güvenle göz ardı edilebilir.
Bu derleme, Java kaynak dosyasında belirtilen paket adı ile adlandırılan mevcut bir dizinde bir dizin yaratacaktır (ör. Satış Ülkesi bizim durumumuzda) ve derlenmiş tüm sınıf dosyalarını içine koyun.
) 4 Adım
Yeni bir dosya oluştur Manifest.txt
sudo gedit Manifest.txt
buna 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.
) 5 Adım
Jar dosyası oluştur
jar cfm ProductSalePerCountry.jar Manifest.txt SalesCountry/*.class
Jar dosyasının oluşturulduğunu kontrol edin
) 6 Adım
Hadoop'u başlat
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
) 7 Adım
Dosyayı Kopyala SatışOcak2009.csv içine ~/inputMapReduce
Şimdi kopyalamak için aşağıdaki komutu kullanın ~/inputMapReduce HDFS'ye.
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal ~/inputMapReduce /
Bu uyarıyı rahatlıkla göz ardı edebiliriz.
Bir dosyanın gerçekten kopyalanıp kopyalanmadığını doğrulayın.
$HADOOP_HOME/bin/hdfs dfs -ls /inputMapReduce
) 8 Adım
MapReduce işini çalıştır
$HADOOP_HOME/bin/hadoop jar ProductSalePerCountry.jar /inputMapReduce /mapreduce_output_sales
Bu, üzerinde mapreduce_output_sales adında bir çıktı dizini oluşturacaktır. HDFS. Bu dizinin içeriği ülkelere göre ürün satışlarını içeren bir dosya olacaktır.
) 9 Adım
Sonuç, komut arayüzü 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'yi açın.
Şimdi seçin 'Dosya sistemine göz atın' ve gidip gidin /mapreduce_output_sales
Açılış bölüm-r-00000
SalesMapper Sınıfının Açıklaması
Bu bölümde uygulanmasını anlayacağız. Satış Haritacısı sınıf.
1. Sınıfımız için bir paket adı belirterek başlıyoruz. Satış Ülkesi paketimizin bir adıdır. Lütfen derleme çıktısının, SalesMapper.class bu paket adıyla adlandırılan bir dizine gidecek: Satış Ülkesi.
Bunu takiben kütüphane paketlerini içe aktarıyoruz.
Aşağıdaki anlık görüntü aşağıdakilerin bir uygulamasını göstermektedir: Satış Haritacısı sınıf-
Örnek Kod Açıklaması:
1. SalesMapper Sınıf Tanımı-
genel sınıf SalesMapper, MapReduceBase'i genişletir ve Mapper'ı uygular {
Her eşleyici sınıfı şu tarihten itibaren genişletilmelidir: HaritaReduceBase sınıf ve uygulaması gerekir mapper Arayüz aynı
2. 'Harita' fonksiyonunun tanımlanması-
public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException
Mapper sınıfının ana kısmı bir 'harita()' Dört argümanı kabul eden yöntem.
Her aramada 'harita()' yöntem, bir anahtar değeri çift ('anahtar' ve 'değer' bu kodda) iletilir.
'harita()' yöntem, argüman olarak alınan giriş metninin bölünmesiyle başlar. Bu satırları kelimelere bölmek için belirteç kullanır.
String valueString = value.toString(); String[] SingleCountryData = valueString.split(",");
Burada, '' sınırlayıcı olarak kullanılır.
Daha sonra dizinin 7. indeksindeki kayıt kullanılarak bir çift oluşturulur. 'Tek Ülke Verileri' ve bir değer '1'.
Output.collect(new Text(SingleCountryData[7]), one);
7. indeksteki rekoru seçiyoruz çünkü ihtiyacımız var Ülke data ve dizideki 7. indekste yer alıyor 'Tek Ülke Verileri'.
Lütfen giriş verilerimizin aşağıdaki formatta olduğunu unutmayın (burada Ülke 7'teth indeks, başlangıç indeksi 0 olan)-
İşlem_tarihi,Ürün,Fiyat,Ödeme_Türü,Ad,Şehir,Eyalet,Ülke,Hesap_Oluşturuldu,Son_Giriş,Enlem,Boylam
Eşleyicinin çıktısı yine bir anahtar değeri kullanılarak çıkarılan çift 'TOPLAMAK()' yöntemi 'Çıktı Toplayıcı'.
SalesCountryReducer Sınıfının Açıklaması
Bu bölümde uygulanmasını anlayacağız. SatışÜlkeRedüktör sınıf.
1. Sınıfımız için paketin adını belirterek başlıyoruz. Satış Ülkesi paketin adıdır. Lütfen derleme çıktısının, SalesCountryReducer.class bu paket adıyla adlandırılan bir dizine gidecek: Satış Ülkesi.
Bunu takiben kütüphane paketlerini içe aktarıyoruz.
Aşağıdaki anlık görüntü aşağıdakilerin bir uygulamasını göstermektedir: SatışÜlkeRedüktör sınıf-
Kod Açıklaması:
1. SalesCountryReducer Sınıfı Tanımı-
genel sınıf SalesCountryReducer, MapReduceBase'i genişletiyor ve Redüktör'ü uyguluyor {
Burada ilk iki veri türü, 'Metin' ve 'Yazılabilir' redüktöre giriş anahtar/değerinin veri türüdür.
Eşleştiricinin çıktısı şu şekildedir: , . Eşleyicinin bu çıktısı redüktöre girdi olur. Yani, veri türüne uyum sağlamak için, Metin ve Yazılabilir Burada veri türü olarak kullanılmaktadır.
Son iki veri türü olan 'Text' ve 'IntWritable', anahtar-değer çifti biçiminde redüktör tarafından üretilen çıktının veri türüdür.
Her redüktör sınıfı şu tarihten itibaren genişletilmelidir: HaritaReduceBase sınıf ve uygulaması gerekir redüktör Arayüz aynı
2. 'Azaltma' fonksiyonunun tanımlanması-
public void reduce( Text t_key, Iterator<IntWritable> values, OutputCollector<Text,IntWritable> output, Reporter reporter) throws IOException {
Bir giriş () Azaltmak yöntem, birden çok değerin listesini içeren bir anahtardır.
Örneğin bizim durumumuzda şöyle olacak:
, , , , , .
Bu redüktöre şu şekilde verilir:
Bu formdaki argümanları kabul etmek için ilk iki veri türü kullanılır: Metin ve Yineleyici. Metin bir anahtar veri türüdür ve Yineleyici o anahtarın değerlerinin listesi için bir veri türüdür.
Bir sonraki argüman türündedir Çıkış Toplayıcı redüktör fazının çıkışını toplayan.
() Azaltmak yöntem, anahtar değerinin kopyalanması ve frekans sayımının 0 olarak başlatılmasıyla başlar.
Metin tuşu = t_key;
int frekansÜlke İçin = 0;
Daha sonra ' kullanaraksırasında' döngüde, anahtarla ilişkili değerler listesini tekrarlıyoruz ve tüm değerleri toplayarak son frekansı hesaplıyoruz.
while (values.hasNext()) { // replace type of value with the actual type of our value IntWritable value = (IntWritable) values.next(); frequencyForCountry += value.get(); }
Şimdi sonucu şu şekilde çıktı toplayıcıya gönderiyoruz: anahtar ve elde edildi sıklık sayısı.
Aşağıdaki kod bunu yapar-
output.collect(key, new IntWritable(frequencyForCountry));
SalesCountryDriver Sınıfının Açıklaması
Bu bölümde uygulanmasını anlayacağız. SatışÜlkeSürücü sınıf
1. Sınıfımız için bir paket adı belirterek başlıyoruz. Satış Ülkesi paketin adıdır. Lütfen derleme çıktısının, SalesCountryDriver.class bu paket adıyla adlandırılan dizine gidecek: Satış Ülkesi.
Burada, kütüphane paketlerini içe aktarmak için paket adını ve ardından kodu belirten bir satır bulunmaktadır.
2. Yeni bir istemci işi, yapılandırma nesnesi oluşturacak ve Eşleştirici ve Düşürücü sınıflarının tanıtımını yapacak bir sürücü sınıfı tanımlayın.
Sürücü sınıfı, MapReduce işimizin çalışacak şekilde ayarlanmasından sorumludur. Hadoop'un. Bu sınıfta şunu belirtiyoruz iş adı, giriş/çıkışın veri türü ve eşleyici ve azaltıcı sınıfların adları.
3. Aşağıdaki kod parçacığında, sırasıyla giriş veri kümesini tüketmek ve çıktı üretmek için kullanılan giriş ve çıkış dizinlerini ayarladık.
argüman[0] ve argüman[1] MapReduce uygulamalı bölümünde 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
Aşağıdaki kod MapReduce işinin yürütülmesini başlatır.
try { // Run the job JobClient.runJob(job_conf); } catch (Exception e) { e.printStackTrace(); }