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:
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_
Langkah 1)
Buat direktori baru dengan nama Tutorial Pengurangan Peta seperti yang ditunjukkan pada contoh MapReduce di bawah ini
sudo mkdir MapReduceTutorial
Beri izin
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(); } } }
Periksa izin file dari semua file ini
dan jika izin 'baca' tidak ada maka berikan hal yang sama-
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/*"
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
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.
Langkah 4)
Buat file baru Manifes.txt
sudo gedit Manifest.txt
tambahkan baris berikut ke dalamnya,
Main-Class: SalesCountry.SalesCountryDriver
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
Periksa apakah file jar telah dibuat
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 /
Kita dapat mengabaikan peringatan ini dengan aman.
Verifikasi apakah suatu file benar-benar disalin atau tidak.
$HADOOP_HOME/bin/hdfs dfs -ls /inputMapReduce
Langkah 8)
Jalankan pekerjaan MapReduce
$HADOOP_HOME/bin/hadoop jar ProductSalePerCountry.jar /inputMapReduce /mapreduce_output_sales
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
Hasilnya juga dapat dilihat melalui antarmuka web sebagai-
Buka r di browser web.
Sekarang pilih 'Jelajahi sistem file' dan arahkan ke /mapreduce_output_sales
Open bagian-r-00000
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-
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 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.
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.
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
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(); }