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ı:

İlk Hadoop MapReduce Programı

Satış VerileriOcak2009

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_

İlk Hadoop MapReduce Programı

) 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

İlk Hadoop MapReduce Programı

İzin verin

sudo chmod -R 777 MapReduceTutorial

İlk Hadoop MapReduce Programı

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

Dosyaları Buradan İndirin

İlk Hadoop MapReduce Programı

Tüm bu dosyaların dosya izinlerini kontrol edin

İlk Hadoop MapReduce Programı

ve eğer 'okuma' izinleri eksikse aynısını verin.

İlk Hadoop MapReduce Programı

) 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/*"

İlk Hadoop MapReduce Programı

) 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

İlk Hadoop MapReduce Programı

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.

İlk Hadoop MapReduce Programı

) 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

İlk Hadoop MapReduce Programı

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

İlk Hadoop MapReduce Programı

Jar dosyasının oluşturulduğunu kontrol edin

İlk Hadoop MapReduce Programı

) 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 /

İlk Hadoop MapReduce Programı

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

İlk Hadoop MapReduce Programı

) 8 Adım

MapReduce işini çalıştır

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

İlk Hadoop MapReduce Programı

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

İlk Hadoop MapReduce Programı

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.

İlk Hadoop MapReduce Programı

Şimdi seçin 'Dosya sistemine göz atın' ve gidip gidin /mapreduce_output_sales

İlk Hadoop MapReduce Programı

Açılış bölüm-r-00000

İlk Hadoop MapReduce Programı

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-

SalesMapper Sınıfı Açıklaması

Ö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-

SalesCountryReducer Sınıfı Açıklaması

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.

SatışÜlkeSürücü Sınıfı Açıklaması

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ı.

SatışÜlkeSürücü Sınıfı Açıklaması

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

SatışÜlkeSürücü Sınıfı Açıklaması

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