Hadoop & Contoh Mapreduce: Buat Program Pertama di Java

Daftar Isi:

Anonim

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

Dalam tutorial ini, Anda akan belajar-

  • Program MapReduce Hadoop Pertama
  • Penjelasan Kelas SalesMapper
  • Penjelasan Kelas SalesCountryReducer
  • Penjelasan Kelas SalesCountryDriver

Program MapReduce Hadoop Pertama

Sekarang dalam tutorial MapReduce ini, kita akan membuat program Java MapReduce pertama kita:

Data PenjualanJan 2009

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

su - hduser_

Langkah 1)

Buat direktori baru dengan nama MapReduceTutorial as shwon dalam 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  {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();}}}

Unduh File Di Sini

Periksa izin file dari semua file ini

dan jika izin 'baca' hilang maka berikan yang sama-

Langkah 2)

Ekspor jalur kelas 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)

Kompilasi file Java (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 dinamai dengan nama paket yang ditentukan dalam file sumber java (yaitu SalesCountry dalam kasus kami) dan meletakkan semua file kelas yang dikompilasi di dalamnya.

Langkah 4)

Buat file baru Manifest.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 sudah dibuat

Langkah 6)

Mulai Hadoop

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

Langkah 7)

Salin File SalesJan2009.csv ke ~ / inputMapReduce

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

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

Peringatan ini dapat diabaikan dengan aman.

Verifikasi apakah 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 di HDFS. Isi direktori ini akan menjadi 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

Hasil juga dapat dilihat melalui antarmuka web sebagai-

Buka r di browser web.

Sekarang pilih 'Jelajahi filesystem' dan arahkan ke / mapreduce_output_sales

Buka bagian-r-00000

Penjelasan Kelas SalesMapper

Di bagian ini, kita akan memahami implementasi kelas SalesMapper .

1. Kita mulai dengan menentukan nama paket untuk kelas kita. SalesCountry adalah nama paket kami. Harap dicatat bahwa output dari kompilasi, SalesMapper.class akan masuk ke direktori yang dinamai dengan nama paket ini: SalesCountry .

Diikuti dengan ini, kami mengimpor paket perpustakaan.

Cuplikan di bawah ini menunjukkan implementasi kelas-

Penjelasan Kode Sampel:

1. Definisi Kelas SalesMapper-

public class SalesMapper extends MapReduceBase mengimplementasikan Mapper {

Setiap kelas mapper harus diperluas dari kelas MapReduceBase dan harus mengimplementasikan antarmuka Mapper .

2. Mendefinisikan fungsi 'peta'-

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

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

Pada setiap panggilan ke metode 'map ()' , pasangan nilai kunci ( 'kunci' dan 'nilai' dalam kode ini) diteruskan.

Metode 'map ()' dimulai dengan memisahkan teks masukan yang diterima sebagai argumen. Ini 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 ke-7 dari larik 'SingleCountryData' dan nilai '1' .

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

Kami memilih record pada indeks ke-7 karena kita membutuhkan data Negara dan terletak di indeks ke-7 dalam larik 'SingleCountryData' .

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

Transaction_date, Product, Price, Payment_Type, Name, City, State, Country , Account_Created, Last_Login, Latitude, Longitude

Keluaran mapper juga merupakan pasangan nilai kunci yang dikeluarkan menggunakan metode 'collect ()' dari 'OutputCollector' .

Penjelasan Kelas SalesCountryReducer

Di bagian ini, kita akan memahami implementasi kelas SalesCountryReducer .

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

Diikuti dengan ini, kami mengimpor paket perpustakaan.

Cuplikan di bawah ini menunjukkan implementasi kelas SalesCountryReducer-

Penjelasan Kode:

1. Definisi Kelas SalesCountryReducer-

public class SalesCountryReducer memperluas MapReduceBase mengimplementasikan Reducer {

Di sini, dua tipe data pertama, 'Text' dan 'IntWritable' adalah tipe data dari input key-value ke reducer.

Output mapper berupa , . Keluaran mapper ini menjadi masukan ke peredam. Jadi, untuk menyelaraskan dengan tipe datanya, Text dan IntWritable digunakan sebagai tipe datanya di sini.

Dua tipe data terakhir yaitu 'Text' dan 'IntWritable' merupakan tipe data keluaran yang dihasilkan oleh reducer berupa key-value pair.

Setiap kelas peredam harus diperluas dari kelas MapReduceBase dan harus mengimplementasikan antarmuka Reducer .

2. Mendefinisikan 'mengurangi' fungsi-

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

Input ke metode reduce () adalah kunci dengan daftar beberapa nilai.

Misalnya, dalam kasus kami, itu akan-

, , , , , .

Ini diberikan kepada peredam sebagai

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

Argumen berikutnya adalah tipe OutputCollector yang mengumpulkan output dari fase peredam.

Metode reduce () dimulai dengan menyalin nilai kunci dan menginisialisasi jumlah frekuensi ke 0.

Tombol teks = t_key; int frequencyForCountry = 0;

Kemudian, dengan menggunakan perulangan 'while' , kita 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 valueIntWritable value = (IntWritable) values.next();frequencyForCountry += value.get();}

Sekarang, kami mendorong hasilnya ke kolektor keluaran dalam bentuk kunci dan mendapatkan jumlah frekuensi .

Kode di bawah ini melakukan ini-

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

Penjelasan Kelas SalesCountryDriver

Di bagian ini, kita akan memahami implementasi kelas SalesCountryDriver

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

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 pekerjaan MapReduce kami agar berjalan di Hadoop. Di kelas ini, kami menentukan nama pekerjaan, tipe data input / output dan nama kelas mapper dan peredam .

3. Dalam potongan kode di bawah ini, kami mengatur direktori input dan output yang digunakan untuk menggunakan dataset input dan menghasilkan output, masing-masing.

arg [0] dan arg [1] adalah argumen baris perintah yang diteruskan dengan perintah yang diberikan di MapReduce hands-on, yaitu,

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

4. Memicu pekerjaan kita

Kode di bawah ini mulai mengeksekusi pekerjaan MapReduce-

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