Dalam tutorial ini, anda akan belajar menggunakan Hadoop dengan MapReduce Contoh. Data input yang digunakan adalah SalesJan2009.csv. Ia mengandungi maklumat berkaitan Penjualan seperti nama Produk, harga, mod pembayaran, bandar, negara pelanggan dan lain-lain. Tujuannya adalah untuk Mengetahui Jumlah Produk yang Dijual 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, kami akan membuat program Java MapReduce pertama kami:
Pastikan Hadoop dipasang. Sebelum anda memulakan proses sebenarnya, ubah pengguna menjadi 'hduser' (id digunakan semasa konfigurasi Hadoop, anda boleh beralih ke userid yang digunakan semasa konfigurasi pengaturcaraan Hadoop).
su - hduser_
Langkah 1)
Buat direktori baru dengan nama MapReduceTutorial sebagai shwon dalam contoh MapReduce di bawah
sudo mkdir MapReduceTutorial
Beri kebenaran
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();}}}
Muat turun Fail Di Sini
Periksa kebenaran fail semua fail ini
dan jika kebenaran 'baca' hilang, berikan yang sama-
Langkah 2)
Eksport classpath seperti yang ditunjukkan dalam contoh Hadoop di bawah
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 fail Java (fail-fail ini ada di direktori Final-MapReduceHandsOn ). Fail kelasnya akan dimasukkan ke dalam direktori pakej
javac -d . SalesMapper.java SalesCountryReducer.java SalesCountryDriver.java
Amaran ini dapat diabaikan dengan selamat.
Kompilasi ini akan membuat direktori dalam direktori semasa yang dinamakan dengan nama pakej yang ditentukan dalam fail sumber java (iaitu SalesCountry dalam kes kami) dan memasukkan semua fail kelas yang disusun di dalamnya.
Langkah 4)
Buat fail baru Manifest.txt
sudo gedit Manifest.txt
tambahkan baris berikut padanya,
Main-Class: SalesCountry.SalesCountryDriver
SalesCountry.SalesCountryDriver adalah nama kelas utama. Harap maklum bahawa anda harus menekan butang enter di hujung baris ini.
Langkah 5)
Buat fail Jar
jar cfm ProductSalePerCountry.jar Manifest.txt SalesCountry/*.class
Periksa bahawa fail balang dibuat
Langkah 6)
Mulakan Hadoop
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
Langkah 7)
Salin File SalesJan2009.csv ke dalam ~ / inputMapReduce
Sekarang Gunakan arahan di bawah untuk menyalin ~ / inputMapReduce ke HDFS.
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal ~/inputMapReduce /
Kami boleh mengabaikan amaran ini dengan selamat.
Sahkan sama ada fail sebenarnya disalin atau tidak.
$HADOOP_HOME/bin/hdfs dfs -ls /inputMapReduce
Langkah 8)
Jalankan tugas MapReduce
$HADOOP_HOME/bin/hadoop jar ProductSalePerCountry.jar /inputMapReduce /mapreduce_output_sales
Ini akan membuat direktori output bernama mapreduce_output_sales pada HDFS. Kandungan direktori ini adalah fail yang mengandungi penjualan produk setiap negara.
Langkah 9)
Hasilnya dapat dilihat melalui antara muka perintah sebagai,
$HADOOP_HOME/bin/hdfs dfs -cat /mapreduce_output_sales/part-00000
Hasilnya juga dapat dilihat melalui antara muka web sebagai-
Buka r dalam penyemak imbas web.
Sekarang pilih 'Browse the filesystem' dan arahkan ke / mapreduce_output_sales
Buka bahagian-r-00000
Penjelasan Kelas SalesMapper
Di bahagian ini, kita akan memahami pelaksanaan kelas SalesMapper .
1. Kita mulakan dengan menentukan nama pakej untuk kelas kita. SalesCountry adalah nama pakej kami. Harap maklum bahawa output kompilasi, SalesMapper.class akan masuk ke dalam direktori yang dinamakan dengan nama pakej ini: SalesCountry .
Diikuti dengan ini, kami mengimport pakej perpustakaan.
Gambar di bawah menunjukkan pelaksanaan kelas SalesMapper-
Contoh Penjelasan Kod:
1. Definisi Kelas SalesMapper-
SalesMapper kelas awam meluaskan MapReduceBase mengimplementasikan Mapper
Setiap kelas mapper mesti dilanjutkan dari kelas MapReduceBase dan mesti melaksanakan antara muka Mapper .
2. Mendefinisikan fungsi 'peta'-
public void map(LongWritable key,Text value,OutputCollectoroutput,Reporter reporter) throws IOException
Bahagian utama kelas Mapper adalah kaedah 'map ()' yang menerima empat argumen.
Pada setiap kaedah panggilan ke 'peta ()' , pasangan nilai-kunci ( 'kunci' dan 'nilai' dalam kod ini) diteruskan.
Kaedah 'map ()' bermula dengan membelah teks input yang diterima sebagai hujah. Ia menggunakan tokenizer untuk membagi baris ini menjadi kata-kata.
String valueString = value.toString();String[] SingleCountryData = valueString.split(",");
Di sini, ',' digunakan sebagai pembatas.
Selepas ini, sepasang dibentuk menggunakan catatan pada indeks ke-7 array 'SingleCountryData' dan nilai '1' .
output.collect (Teks baru (SingleCountryData [7]), satu);
Kami memilih rekod pada indeks ke-7 kerana kami memerlukan data Negara dan ia berada di indeks ke-7 dalam array 'SingleCountryData' .
Harap maklum bahawa data input kami dalam format di bawah (di mana Negara berada di indeks ke- 7 , dengan 0 sebagai indeks permulaan) -
Tarikh_ Transaksi, Produk, Harga, Jenis_Pembayaran, Nama, Bandar, Negeri, Negara , Akaun_Dicipta, Log_ Terakhir, Lintang, Bujur
Keluaran mapper sekali lagi adalah pasangan nilai-kunci yang dihasilkan menggunakan kaedah 'collect ()' dari 'OutputCollector' .
Penjelasan Kelas SalesCountryReducer
Di bahagian ini, kita akan memahami pelaksanaan kelas SalesCountryReducer .
1. Kami mulakan dengan menentukan nama pakej untuk kelas kami. SalesCountry adalah nama pakej keluar. Harap maklum bahawa output kompilasi, SalesCountryReducer.class akan masuk ke dalam direktori yang dinamakan dengan nama pakej ini: SalesCountry .
Diikuti dengan ini, kami mengimport pakej perpustakaan.
Gambar di bawah menunjukkan pelaksanaan kelas SalesCountryReducer-
Penjelasan Kod:
1. Definisi Kelas SalesCountryReducer-
kelas awam SalesCountryReducer meluaskan MapReduceBase melaksanakan Reducer
Di sini, dua jenis data pertama, 'Teks' dan 'IntWritable' adalah jenis data input-value to the reducer.
Keluaran mapper adalah dalam bentuk
Dua jenis data terakhir, 'Teks' dan 'IntWritable' adalah jenis data keluaran yang dihasilkan oleh pengurang dalam bentuk pasangan nilai-kunci.
Setiap kelas pengurang mesti dilanjutkan dari kelas MapReduceBase dan ia mesti melaksanakan antara muka Reducer .
2. Mendefinisikan fungsi 'mengurangkan'-
public void reduce( Text t_key,Iteratorvalues,OutputCollector output,Reporter reporter) throws IOException {
Input untuk kaedah mengurangkan () adalah kunci dengan senarai pelbagai nilai.
Sebagai contoh, dalam kes kita, ia akan-
Ini diberikan kepada pengurang sebagai
Oleh itu, untuk menerima argumen borang ini, dua jenis data pertama digunakan, iaitu, Teks dan Iterator
Argumen seterusnya adalah jenis OutputCollector
kaedah mengurangkan () dimulakan dengan menyalin nilai kunci dan mengira bilangan frekuensi menjadi 0.
Kekunci teks = t_key; int frekuensiForCountry = 0;
Kemudian, dengan menggunakan gelung 'while' , kami mengulangi senarai nilai yang berkaitan dengan kunci dan mengira 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 menyerahkan hasilnya ke pengumpul output dalam bentuk kunci dan memperolehi frekuensi .
Kod di bawah melakukan ini-
output.collect(key, new IntWritable(frequencyForCountry));
Penjelasan Kelas SalesCountryDriver
Di bahagian ini, kita akan memahami pelaksanaan kelas SalesCountryDriver
1. Kita mulakan dengan menentukan nama pakej untuk kelas kita. SalesCountry adalah nama pakej keluar. Harap maklum bahawa output kompilasi, SalesCountryDriver.class akan masuk ke dalam direktori yang dinamakan dengan nama pakej ini: SalesCountry .
Berikut adalah garis yang menentukan nama pakej diikuti dengan kod untuk mengimport pakej perpustakaan.
2. Tentukan kelas pemandu yang akan membuat pekerjaan klien baru, objek konfigurasi dan mengiklankan kelas Mapper dan Reducer.
Kelas pemandu bertanggungjawab untuk menetapkan tugas MapReduce kami untuk dijalankan di Hadoop. Di kelas ini, kami menentukan nama pekerjaan, jenis input / output data dan nama kelas mapper dan reducer .
3. Dalam coretan kod di bawah, kami menetapkan direktori input dan output yang masing-masing digunakan untuk menggunakan set data input dan menghasilkan output.
arg [0] dan arg [1] adalah argumen baris perintah yang diteruskan dengan perintah yang diberikan dalam MapReduce hands-on, iaitu,
$ HADOOP_HOME / tong / hadoop jar ProductSalePerCountry.jar / inputMapReduce / mapreduce_output_sales
4. Mencetuskan tugas kita
Di bawah kod mulakan pelaksanaan kerja MapReduce-
try {// Run the jobJobClient.runJob(job_conf);} catch (Exception e) {e.printStackTrace();}