Hadoop & Mapreduce Ví dụ: Tạo chương trình đầu tiên trong Java

Mục lục:

Anonim

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.

Trong hướng dẫn này, bạn sẽ học-

  • Chương trình MapReduce Hadoop đầu tiên
  • Giải thích về Lớp SalesMapper
  • Giải thích về Lớp SalesCountryReducer
  • Giải thích về Lớp SalesCountryDriver

Chương trình MapReduce Hadoop đầu tiên

Bây giờ trong hướng dẫn MapReduce này, chúng ta sẽ tạo chương trình Java MapReduce đầu tiên của mình:

Dữ liệu bán hàngJan2009

Đảm bảo bạn đã cài đặt Hadoop. Trước khi bạn bắt đầu với quy trình thực, 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  {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();}}}

Tải xuống tệp tại đây

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ờ 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 bên dưới 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 {

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 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''giá trị' trong mã này) được chuyển.

Phương thức 'map ()' bắt đầu bằng cách tách văn bản đầ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 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]), một);

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 á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 {

Ở đây, hai kiểu dữ liệu đầu tiên, 'Văn bản''Có thể ghi được' 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 , . Đầu ra của trình ánh xạ này trở thành đầu vào cho bộ giảm tốc. Vì vậy, để phù hợp với kiểu dữ liệu của nó, ở đây sử dụng Văn bảnGhi nội dung làm kiểu dữ liệu.

Hai kiểu dữ liệu cuối cùng, 'Văn bản' và 'Có thể ghi được' là kiểu dữ liệu đầu ra được tạo bởi bộ giảm tốc ở dạng cặp khóa-giá trị.

Mọi lớp giảm thiểu phải được mở rộng từ lớp MapReduceBase và nó phải triển khai giao diện Giảm .

2. Định nghĩa hàm 'giảm'-

public void reduce( Text t_key,Iterator values,OutputCollector 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ẽ-

, , , , , .

Điều này được gán cho rút gọn

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., TextIterator . Văn bản là một kiểu dữ liệu của khóa và Iterator 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 thu thập kết quả đầu ra của pha giảm 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.

Khóa văn bản = 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 valueIntWritable 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óatầ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 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 giảm 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]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 là đoạn mã bắt đầu thực thi công việc MapReduce-

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