Tech

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

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:

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

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_

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

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

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

Cấp quyền

sudo chmod -R 777 MapReduceTutorial

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

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();

        }

    }

}

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

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

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

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

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

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

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 / * “

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

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

Ví dụ về Hadoop & Mapreduce: Tạo chương trình đầu tiên trong 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 đó.

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

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

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

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

Ví dụ về Hadoop & Mapreduce: Tạo chương trình đầu tiên của bạn

Kiểm tra xem tệp jar đã được tạo chưa

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

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 /

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

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

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

Bước 8)

Chạy công việc MapReduce

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

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

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

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

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.

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

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

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

Mở  part-r-00000

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

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-

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

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-

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

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.

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

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 .

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

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

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

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();

}

Back to top button
You cannot copy content of this page