Ví dụ về Hadoop & Mapreduce: Tạo chương trình đầu tiên trong Java
Trong hướng dẫn này, bạn sẽ học cách sử dụng Hadoop với MapReduce Examples. Dữ liệu đầu vào được sử dụng là SalesJan2009.csv . Nó chứa thông tin liên quan đến Bán hàng như Tên sản phẩm, giá cả, phương thức thanh toán, thành phố, quốc gia của khách hàng, v.v. Mục tiêu là Tìm hiểu Số lượng Sản phẩm Được Bán ở Mỗi Quốc gia. Hãy theo dõi cùng blogtiendientu nhé
==>> java hadoop nâng cao
Video java hadoop
- 10 trang web hàng đầu như Omegle – Nói chuyện với người lạ
- Tập làm văn lớp 2: Viết 4-5 câu về một việc em đã làm thể hiện sự quan tâm chăm sóc ông bà
- Đoạn văn tiếng Anh viết về những bất lợi của người mẹ đi làm
- Cách tag tất cả thành viên trong nhóm chat Messenger cực dễ
- Học blockchain bắt đầu từ đâu 2021
Chương trình MapReduce Hadoop đầu tiên
Bây giờ trong hướng dẫn MapReduce này, chúng tôi sẽ tạo chương trình Java MapReduce đầu tiên của chúng tôi:

Dữ liệu bán hàng Jan2009
Đảm bảo bạn đã cài đặt Hadoop. Trước khi bạn bắt đầu với quy trình thực tế, hãy thay đổi người dùng thành ‘hduser’ (id được sử dụng trong khi cấu hình Hadoop, bạn có thể chuyển sang userid được sử dụng trong quá trình cấu hình lập trình Hadoop của mình).
su – hduser_

Bước 1)
Tạo một thư mục mới với tên MapReduceTutorial là shwon trong ví dụ MapReduce bên dưới
sudo mkdir MapReduceTutorial

Cấp quyền
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);
// Run the job
JobClient.runJob(job_conf);
} catch (Exception e) {
e.printStackTrace();
}
}
}

Kiểm tra quyền đối với tệp của tất cả các tệp này

và nếu quyền ‘đọc’ bị thiếu thì hãy cấp quyền tương tự-

Bước 2)
Xuất classpath như được hiển thị trong ví dụ Hadoop bên dưới
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 / * “

Bước 3)
Biên dịch các tệp Java (các tệp này có trong thư mục Final-MapReduceHandsOn ). Các tệp lớp của nó sẽ được đưa vào thư mục gói
javac -d. SalesMapper.java SalesCountryReducer.java SalesCountryDriver.java

Cảnh báo này có thể được bỏ qua một cách an toàn.
Việc biên dịch này sẽ tạo một thư mục trong thư mục hiện tại có tên với tên gói được chỉ định trong tệp nguồn java (tức là SalesCountry trong trường hợp của chúng tôi) và đặt tất cả các tệp lớp đã biên dịch vào đó.

Bước 4)
Tạo tệp mới Manifest.txt
sudo gedit Manifest.txt
thêm các dòng sau vào nó,
Main-Class: SalesCountry.SalesCountryDriver

SalesCountry.SalesCountryDriver là tên của lớp chính. Xin lưu ý rằng bạn phải nhấn phím enter ở cuối dòng này.
Bước 5)
Tạo tệp Jar
jar cfm ProductSalePerCountry.jar Manifest.txt SalesCountry / *. class
Kiểm tra xem tệp jar đã được tạo chưa

Bước 6)
Khởi động Hadoop
$ HADOOP_HOME / sbin / start-dfs.sh
$ HADOOP_HOME / sbin / start-yarn.sh
Bước 7)
Sao chép tệp SalesJan2009.csv vào ~ / inputMapReduce
Bây giờ Sử dụng lệnh dưới đây để sao chép ~ / inputMapReduce sang HDFS.
$ HADOOP_HOME / bin / hdfs dfs -copyFromLocal ~ / inputMapReduce /

Chúng ta có thể bỏ qua cảnh báo này một cách an toàn.
Xác minh xem tệp có thực sự được sao chép hay không.
$ HADOOP_HOME / bin / hdfs dfs -ls / inputMapReduce

Bước 8)
Chạy công việc MapReduce
$ HADOOP_HOME / bin / hadoop jar ProductSalePerCountry.jar / inputMapReduce / mapreduce_output_sales

Thao tác này sẽ tạo một thư mục đầu ra có tên mapreduce_output_sales trên HDFS. Nội dung của thư mục này sẽ là một tệp chứa doanh số bán sản phẩm cho mỗi quốc gia.
Bước 9)
Kết quả có thể được nhìn thấy thông qua giao diện lệnh như,
$ HADOOP_HOME / bin / hdfs dfs -cat / mapreduce_output_sales / part-00000

Kết quả cũng có thể được nhìn thấy qua giao diện web như-
Mở r trong trình duyệt web.

Bây giờ hãy chọn ‘Duyệt qua hệ thống tệp’ và điều hướng đến / mapreduce_output_sales

Mở part-r-00000

Giải thích về Lớp SalesMapper
Trong phần này, chúng ta sẽ hiểu việc triển khai lớp SalesMapper .
1. Chúng ta bắt đầu bằng cách chỉ định tên của gói cho lớp của chúng ta. SalesCountry là tên một gói của chúng tôi. Xin lưu ý rằng đầu ra của biên dịch, SalesMapper.class sẽ đi vào một thư mục được đặt tên theo tên gói này: SalesCountry .
Tiếp theo, chúng tôi nhập các gói thư viện.
Ảnh chụp nhanh dưới đây cho thấy việc triển khai lớp SalesMapper-

Giải thích mã mẫu:
1. Định nghĩa Lớp SalesMapper-
public class SalesMapper mở rộng MapReduceBase triển khai Mapper <LongW ghi được, text, text, ghi âm> {
Mọi lớp ánh xạ phải được mở rộng từ lớp MapReduceBase và nó phải triển khai giao diện Mapper .
2. Xác định chức năng ‘bản đồ’-
public void map(LongWritable key,
Text value,
OutputCollector<Text, IntWritable> output,
Reporter reporter) throws IOException
Phần chính của lớp Mapper là một phương thức ‘map ()’ chấp nhận bốn đối số.
Tại mỗi lệnh gọi đến phương thức ‘map ()’ , một cặp khóa-giá trị ( ‘khóa’ và ‘giá trị’ trong mã này) được chuyển.
Phương thức ‘map ()’ bắt đầu bằng cách tách text đầu vào được nhận dưới dạng đối số. Nó sử dụng tokenizer để chia các dòng này thành các từ.
String valueString = value.toString();
String[] SingleCountryData = valueString.split(“,”);
Ở đây, ‘,’ được sử dụng làm dấu phân cách.
Sau đó, một cặp được hình thành bằng cách sử dụng bản ghi ở chỉ số thứ 7 của mảng ‘SingleCountryData’ và giá trị ‘1’ .
output.collect(new Text(SingleCountryData[7]), one);
Chúng tôi đang chọn bản ghi ở chỉ mục thứ 7 vì chúng ta cần dữ liệu Quốc gia và nó nằm ở chỉ mục thứ 7 trong mảng ‘SingleCountryData’ .
Xin lưu ý rằng dữ liệu đầu vào của chúng tôi ở định dạng dưới đây (trong đó Quốc gia ở chỉ mục thứ 7 , với 0 là chỉ số bắt đầu) –
Giao_dịch_ngày, Sản phẩm, Giá, Thanh toán_Loại, Tên, Thành phố, Tiểu bang, Quốc gia , Tài khoản_Đã tạo, Đăng nhập cuối cùng, Vĩ độ, Kinh độ
Một đầu ra của trình ánh xạ lại là một cặp khóa-giá trị được xuất bằng phương thức ‘collect ()’ của ‘OutputCollector’ .
Giải thích về Lớp SalesCountryReducer
Trong phần này, chúng ta sẽ hiểu việc triển khai lớp SalesCountryReducer .
1. Chúng ta bắt đầu bằng cách chỉ định tên của gói cho lớp của chúng ta. SalesCountry là một tên của gói ngoài. Xin lưu ý rằng đầu ra của biên dịch, SalesCountryReducer.class sẽ đi vào một thư mục có tên theo tên gói này: SalesCountry .
Tiếp theo, chúng tôi nhập các gói thư viện.
Ảnh chụp nhanh bên dưới cho thấy việc triển khai lớp SalesCountryReducer-

Giải thích mã:
1. Định nghĩa lớp SalesCountryReducer-
public class SalesCountryReducer mở rộng MapReduceBase triển khai Reducer <Text, IntW ghi, Text, IntW …> {
Ở đây, hai kiểu dữ liệu đầu tiên, ‘Text‘ và ‘IntWritable‘ là kiểu dữ liệu của khóa-giá trị đầu vào cho trình rút gọn .
Đầu ra của ánh xạ có dạng <CountryName1, 1>, <CountryName2, 1>. Đầu ra của ánh xạ này trở thành đầu vào cho bộ reduce tốc. Vì vậy, để phù hợp với kiểu dữ liệu của nó, ở đây sử dụng Text và IntWritable làm kiểu dữ liệu.
Hai kiểu dữ liệu cuối cùng, ‘text’ và ‘Có thể ghi được’ là kiểu dữ liệu đầu ra được tạo bởi bộ reduce tốc ở dạng cặp khóa-giá trị.
Mọi lớp reduce thiểu phải được mở rộng từ lớp MapReduceBase và nó phải triển khai giao diện reduce .
2. Định nghĩa chức năng ‘reduce’-
public void reduce( Text t_key,
Iterator<IntWritable> values,
OutputCollector<Text,IntWritable> output,
Reporter reporter) throws IOException {
Đầu vào cho phương thức Reduce () là một khóa có danh sách nhiều giá trị.
Ví dụ, trong trường hợp của chúng tôi, nó sẽ-
<United Arab Emirates, 1>, <United Arab Emirates, 1>, <United Arab Emirates, 1>, <United Arab Emirates, 1>, <United Arab Emirates, 1>, <United Arab Emirates, 1>.
Điều này được gán cho rút gọn là <Các Tiểu vương quốc Ả Rập Thống nhất, {1,1,1,1,1,1}>
Vì vậy, để chấp nhận các đối số của biểu mẫu này, hai kiểu dữ liệu đầu tiên được sử dụng, viz., Text và Iterator <IntW ghi> . text là một kiểu dữ liệu của khóa và Iterator <IntW ghi> là một kiểu dữ liệu cho danh sách các giá trị cho khóa đó.
Đối số tiếp theo có kiểu OutputCollector <Text, IntW … để thu thập kết quả đầu ra của pha reduce tốc.
Phương thức Reduce () bắt đầu bằng cách sao chép giá trị khóa và khởi tạo tần số đếm thành 0.
Text key = t_key;
int frequencyForCountry = 0;
Sau đó, sử dụng vòng lặp ‘ while ‘ , chúng tôi lặp lại danh sách các giá trị được liên kết với khóa và tính tần suất cuối cùng bằng cách tính tổng tất cả các giá trị.
while (values.hasNext()) {
// replace type of value with the actual type of our value
IntWritable value = (IntWritable) values.next();
frequencyForCountry += value.get();
}
Bây giờ, chúng tôi đẩy kết quả đến bộ thu đầu ra dưới dạng số khóa và tần số thu được .
Đoạn mã dưới đây thực hiện điều này-
output.collect(key, new IntWritable(frequencyForCountry));
Giải thích về Lớp SalesCountryDriver
Trong phần này, chúng ta sẽ hiểu việc triển khai lớp SalesCountryDriver
1. Chúng ta bắt đầu bằng cách chỉ định một tên của gói cho lớp của chúng ta. SalesCountry là một tên của gói ngoài. Xin lưu ý rằng đầu ra của biên dịch, SalesCountryDriver.class sẽ đi vào thư mục có tên theo tên gói này: SalesCountry .
Đây là một dòng chỉ định tên gói, theo sau là mã để nhập các gói thư viện.

2. Định nghĩa một lớp trình điều khiển sẽ tạo ra một công việc máy khách mới, đối tượng cấu hình và quảng cáo các lớp Mapper và Reducer.
Lớp trình điều khiển chịu trách nhiệm thiết lập công việc MapReduce của chúng tôi để chạy trong Hadoop. Trong lớp này, chúng tôi chỉ định tên công việc, kiểu dữ liệu của đầu vào / đầu ra và tên của các lớp ánh xạ và trình reduce thiểu .

3. Trong đoạn mã dưới đây, chúng tôi đặt các thư mục đầu vào và đầu ra được sử dụng để sử dụng tập dữ liệu đầu vào và tạo ra đầu ra tương ứng.
arg [0] và arg [1] là các đối số dòng lệnh được truyền với một lệnh được đưa ra trong MapReduce thực hành, tức là
$ HADOOP_HOME / bin / hadoop jar ProductSalePerCountry.jar / inputMapReduce / mapreduce_output_sales

4. Kích hoạt công việc của chúng tôi
Dưới đây mã bắt đầu thực thi công việc MapReduce-
try {
// Run the job
JobClient.runJob(job_conf);
} catch (Exception e) {
e.printStackTrace();
}