Contoh Hadoop & Mapreduce: Buat Program Pertama di Java

Dalam tutorial ini, Anda akan belajar menggunakan Hadoop dengan Contoh MapReduce. Data masukan yang digunakan adalah PenjualanJan2009.csv. Ini berisi informasi terkait Penjualan seperti nama Produk, harga, cara pembayaran, kota, negara klien, dll. Tujuannya adalah untuk Cari Tahu Jumlah Produk Terjual di Setiap Negara.

Program MapReduce Hadoop Pertama

Sekarang dalam hal ini Tutorial MapReduce, kami akan membuat yang pertama Java Program MapReduce:

Program MapReduce Hadoop Pertama

Data PenjualanJan2009

Pastikan Anda telah menginstal Hadoop. Sebelum Anda memulai proses sebenarnya, ubah pengguna menjadi 'hduser' (id digunakan saat konfigurasi Hadoop, Anda dapat beralih ke pengguna yang digunakan selama konfigurasi pemrograman Hadoop Anda).

su - hduser_

Program MapReduce Hadoop Pertama

Langkah 1)

Buat direktori baru dengan nama Tutorial Pengurangan Peta seperti yang ditunjukkan pada contoh MapReduce di bawah ini

sudo mkdir MapReduceTutorial

Program MapReduce Hadoop Pertama

Beri izin

sudo chmod -R 777 MapReduceTutorial

Program MapReduce Hadoop Pertama

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

Unduh File Disini

Program MapReduce Hadoop Pertama

Periksa izin file dari semua file ini

Program MapReduce Hadoop Pertama

dan jika izin 'baca' tidak ada maka berikan hal yang sama-

Program MapReduce Hadoop Pertama

Langkah 2)

Ekspor classpath seperti yang ditunjukkan pada contoh Hadoop di bawah ini

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

Program MapReduce Hadoop Pertama

Langkah 3)

Menyusun Java file (file-file ini ada di direktori Final-MapReduceHandsOn). File kelasnya akan diletakkan di direktori paket

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

Program MapReduce Hadoop Pertama

Peringatan ini dapat diabaikan dengan aman.

Kompilasi ini akan membuat direktori di direktori saat ini yang diberi nama dengan nama paket yang ditentukan dalam file sumber java (mis Negara Penjualan dalam kasus kami) dan letakkan semua file kelas yang dikompilasi di dalamnya.

Program MapReduce Hadoop Pertama

Langkah 4)

Buat file baru Manifes.txt

sudo gedit Manifest.txt

tambahkan baris berikut ke dalamnya,

Main-Class: SalesCountry.SalesCountryDriver

Program MapReduce Hadoop Pertama

SalesCountry.SalesCountryDriver adalah nama kelas utama. Harap dicatat bahwa Anda harus menekan tombol enter di akhir baris ini.

Langkah 5)

Buat file Jar

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

Program MapReduce Hadoop Pertama

Periksa apakah file jar telah dibuat

Program MapReduce Hadoop Pertama

Langkah 6)

Mulai Hadoop

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

Langkah 7)

Salin Filenya PenjualanJan2009.csv ke ~/inputMapReduce

Sekarang Gunakan perintah di bawah ini untuk menyalin ~/inputMapReduce ke HDFS.

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

Program MapReduce Hadoop Pertama

Kita dapat mengabaikan peringatan ini dengan aman.

Verifikasi apakah suatu file benar-benar disalin atau tidak.

$HADOOP_HOME/bin/hdfs dfs -ls /inputMapReduce

Program MapReduce Hadoop Pertama

Langkah 8)

Jalankan pekerjaan MapReduce

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

Program MapReduce Hadoop Pertama

Ini akan membuat direktori keluaran bernama mapreduce_output_sales aktif HDFS. Isi direktori ini akan berupa file yang berisi penjualan produk per negara.

Langkah 9)

Hasilnya dapat dilihat melalui antarmuka perintah sebagai,

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

Program MapReduce Hadoop Pertama

Hasilnya juga dapat dilihat melalui antarmuka web sebagai-

Buka r di browser web.

Program MapReduce Hadoop Pertama

Sekarang pilih 'Jelajahi sistem file' dan arahkan ke /mapreduce_output_sales

Program MapReduce Hadoop Pertama

Open bagian-r-00000

Program MapReduce Hadoop Pertama

Penjelasan Kelas SalesMapper

Pada bagian ini, kita akan memahami implementasi Pemeta Penjualan kelas.

1. Kita mulai dengan menentukan nama paket untuk kelas kita. Negara Penjualan adalah nama paket kami. Harap dicatat bahwa keluaran kompilasi, SalesMapper.kelas akan masuk ke direktori yang diberi nama dengan nama paket ini: Negara Penjualan.

Diikuti dengan ini, kami mengimpor paket perpustakaan.

Cuplikan di bawah ini menunjukkan implementasi dari Pemeta Penjualan kelas-

Penjelasan Kelas SalesMapper

Contoh Penjelasan Kode:

1. Definisi Kelas SalesMapper-

SalesMapper kelas publik memperluas implementasi MapReduceBase Mapper {

Setiap kelas mapper harus di-extend dari MapReduceBase kelas dan itu harus diimplementasikan Pembuat peta Antarmuka.

2. Mendefinisikan fungsi 'peta'-

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

Bagian utama dari kelas Mapper adalah a 'peta()' metode yang menerima empat argumen.

Di setiap panggilan ke 'peta()' metode, a nilai kunci pasangan ('kunci' dan 'nilai' dalam kode ini) diteruskan.

'peta()' Metode dimulai dengan memisahkan teks masukan yang diterima sebagai argumen. Ia menggunakan tokenizer untuk membagi baris-baris ini menjadi kata-kata.

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

Di sini, ',' digunakan sebagai pembatas.

Setelah ini, pasangan dibentuk menggunakan catatan pada indeks array ke-7 'Data Negara Tunggal' dan sebuah nilai '1'.

output.collect(Teks baru(SingleCountryData[7]), satu);

Kami memilih record pada indeks ke-7 karena kami membutuhkannya Negara data dan terletak di indeks ke-7 dalam array 'Data Negara Tunggal'.

Harap dicatat bahwa data masukan kami dalam format di bawah ini (di mana Negara berada di 7th indeks, dengan 0 sebagai indeks awal)-

Tanggal_Transaksi,Produk,Harga,Jenis_Pembayaran,Nama,Kota,Negara Bagian,Negara,Akun_Dibuat,Login_Terakhir,Lintang,Bujur

Output dari mapper lagi-lagi a nilai kunci pasangan yang dikeluarkan menggunakan 'mengumpulkan()' metode dari 'Kolektor Keluaran'.

Penjelasan Kelas SalesCountryReducer

Pada bagian ini, kita akan memahami implementasi SalesCountryReducer kelas.

1. Kita mulai dengan menentukan nama paket untuk kelas kita. Negara Penjualan adalah nama paket keluar. Harap dicatat bahwa keluaran kompilasi, SalesCountryReducer.kelas akan masuk ke direktori yang diberi nama dengan nama paket ini: Negara Penjualan.

Diikuti dengan ini, kami mengimpor paket perpustakaan.

Cuplikan di bawah ini menunjukkan implementasi dari SalesCountryReducer kelas-

Penjelasan Kelas SalesCountryReducer

Penjelasan Kode:

1. Definisi Kelas SalesCountryReducer-

kelas publik SalesCountryReducer memperluas implementasi MapReduceBase Reducer {

Di sini, dua tipe data pertama, 'Teks' dan 'Tidak Dapat Ditulis' adalah tipe data nilai kunci masukan ke peredam.

Output dari mapper berupa , . Output dari mapper ini menjadi input ke peredam. Jadi, untuk menyelaraskan dengan tipe datanya, Teks dan Tidak Dapat Ditulis digunakan sebagai tipe data di sini.

Dua tipe data terakhir, 'Teks' dan 'IntWritable' merupakan tipe data keluaran yang dihasilkan oleh peredam dalam bentuk pasangan nilai kunci.

Setiap kelas peredam harus diperluas MapReduceBase kelas dan itu harus diimplementasikan Peredam Antarmuka.

2. Mendefinisikan fungsi 'mengurangi'-

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

Sebuah masukan untuk mengurangi() metode adalah kunci dengan daftar beberapa nilai.

Misalnya, dalam kasus kami, itu akan menjadi-

, , , , , .

Ini diberikan kepada peredam sebagai

Jadi, untuk menerima argumen bentuk ini, dua tipe data pertama digunakan, yaitu, Teks dan Pengulangan. Teks adalah tipe data kunci dan Pengulangan adalah tipe data untuk daftar nilai kunci itu.

Argumen selanjutnya adalah tipe Kolektor Keluaran yang mengumpulkan keluaran fase peredam.

mengurangi() Metode dimulai dengan menyalin nilai kunci dan menginisialisasi penghitungan frekuensi ke 0.

Kunci teks = t_key;
int frekuensiUntukNegara = 0;

Kemudian, menggunakan 'ketika' loop, kami mengulangi daftar nilai yang terkait dengan kunci dan menghitung frekuensi akhir dengan menjumlahkan semua nilai.

 while (values.hasNext()) {
            // replace type of value with the actual type of our value
            IntWritable value = (IntWritable) values.next();
            frequencyForCountry += value.get();
            
        }

Sekarang kita dorong hasilnya ke kolektor keluaran dalam bentuk kunci dan diperoleh jumlah frekuensi.

Kode di bawah ini melakukan ini-

output.collect(key, new IntWritable(frequencyForCountry));

Penjelasan Kelas SalesCountryDriver

Pada bagian ini, kita akan memahami implementasi Pengemudi Negara Penjualan kelas

1. Kita mulai dengan menentukan nama paket untuk kelas kita. Negara Penjualan adalah nama paket keluar. Harap dicatat bahwa keluaran kompilasi, SalesCountryDriver.kelas akan masuk ke direktori yang diberi nama dengan nama paket ini: Negara Penjualan.

Berikut adalah baris yang menentukan nama paket diikuti dengan kode untuk mengimpor paket perpustakaan.

Penjelasan Kelas SalesCountryDriver

2. Tentukan kelas driver yang akan membuat pekerjaan klien baru, objek konfigurasi dan mengiklankan kelas Mapper dan Reducer.

Kelas driver bertanggung jawab untuk mengatur agar tugas MapReduce kita dijalankan Hadoop. Di kelas ini, kami menentukan nama pekerjaan, tipe data input/output dan nama kelas mapper dan peredam.

Penjelasan Kelas SalesCountryDriver

3. Dalam cuplikan kode di bawah ini, kita mengatur direktori input dan output yang masing-masing digunakan untuk menggunakan kumpulan data input dan menghasilkan output.

argumen[0] dan argumen[1] adalah argumen baris perintah yang diteruskan dengan perintah yang diberikan langsung di MapReduce, yaitu,

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

Penjelasan Kelas SalesCountryDriver

4. Memicu pekerjaan kita

Kode di bawah ini memulai eksekusi pekerjaan MapReduce-

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