MapReduce - Bộ kết hợp

Combiner, còn được gọi là semi-reducer, là một lớp tùy chọn hoạt động bằng cách chấp nhận các đầu vào từ lớp Bản đồ và sau đó chuyển các cặp khóa-giá trị đầu ra cho lớp Giảm.

Chức năng chính của Combiner là tóm tắt các bản ghi đầu ra bản đồ với cùng một khóa. Đầu ra (tập hợp khóa-giá trị) của bộ kết hợp sẽ được gửi qua mạng đến tác vụ Bộ giảm tốc thực tế làm đầu vào.

Combiner

Lớp Combiner được sử dụng giữa lớp Map và lớp Reduce để giảm khối lượng truyền dữ liệu giữa Map và Reduce. Thông thường, kết quả đầu ra của tác vụ bản đồ lớn và dữ liệu được chuyển sang tác vụ giảm sẽ cao.

Sơ đồ nhiệm vụ MapReduce sau đây cho thấy GIAI ĐOẠN KẾT HỢP.

Combiner hoạt động như thế nào?

Đây là bản tóm tắt ngắn gọn về cách hoạt động của MapReduce Combiner -

  • Một bộ kết hợp không có giao diện được xác định trước và nó phải triển khai phương thức Reduce () của giao diện Reducer.

  • Một bộ kết hợp hoạt động trên mỗi khóa xuất bản đồ. Nó phải có cùng loại giá trị-khóa đầu ra như lớp Giảm tốc.

  • Một bộ kết hợp có thể tạo ra thông tin tóm tắt từ một tập dữ liệu lớn vì nó thay thế đầu ra Bản đồ gốc.

Mặc dù, Combiner là tùy chọn nhưng nó giúp tách dữ liệu thành nhiều nhóm cho giai đoạn Reduce, giúp xử lý dễ dàng hơn.

Triển khai MapReduce Combiner

Ví dụ sau đây cung cấp một ý tưởng lý thuyết về bộ kết hợp. Giả sử chúng tôi có tệp văn bản đầu vào sau có têninput.txt cho MapReduce.

What do you mean by Object
What do you know about Java
What is Java Virtual Machine
How Java enabled High Performance

Các giai đoạn quan trọng của chương trình MapReduce với Combiner được thảo luận dưới đây.

Trình đọc ghi

Đây là giai đoạn đầu tiên của MapReduce trong đó Trình đọc Bản ghi đọc mọi dòng từ tệp văn bản đầu vào dưới dạng văn bản và cho kết quả đầu ra dưới dạng các cặp khóa-giá trị.

Input - Từng dòng văn bản từ tệp đầu vào.

Output- Hình thành các cặp khóa-giá trị. Sau đây là tập hợp các cặp khóa-giá trị mong đợi.

<1, What do you mean by Object>
<2, What do you know about Java>
<3, What is Java Virtual Machine>
<4, How Java enabled High Performance>

Giai đoạn bản đồ

Giai đoạn Bản đồ lấy đầu vào từ Trình đọc bản ghi, xử lý nó và tạo ra đầu ra dưới dạng một tập hợp các cặp khóa-giá trị khác.

Input - Cặp khóa-giá trị sau là đầu vào được lấy từ Trình đọc bản ghi.

<1, What do you mean by Object>
<2, What do you know about Java>
<3, What is Java Virtual Machine>
<4, How Java enabled High Performance>

Giai đoạn Bản đồ đọc từng cặp khóa-giá trị, chia từng từ khỏi giá trị bằng cách sử dụng StringTokenizer, coi mỗi từ là khóa và số lượng từ đó là giá trị. Đoạn mã sau hiển thị lớp Mapper và hàm bản đồ.

public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>
{
   private final static IntWritable one = new IntWritable(1);
   private Text word = new Text();
   
   public void map(Object key, Text value, Context context) throws IOException, InterruptedException 
   {
      StringTokenizer itr = new StringTokenizer(value.toString());
      while (itr.hasMoreTokens()) 
      {
         word.set(itr.nextToken());
         context.write(word, one);
      }
   }
}

Output - Sản lượng dự kiến ​​như sau -

<What,1> <do,1> <you,1> <mean,1> <by,1> <Object,1>
<What,1> <do,1> <you,1> <know,1> <about,1> <Java,1>
<What,1> <is,1> <Java,1> <Virtual,1> <Machine,1>
<How,1> <Java,1> <enabled,1> <High,1> <Performance,1>

Giai đoạn kết hợp

Giai đoạn Bộ kết hợp lấy từng cặp khóa-giá trị từ giai đoạn Bản đồ, xử lý nó và tạo ra kết quả là key-value collection cặp.

Input - Cặp khóa-giá trị sau là đầu vào được lấy từ pha Bản đồ.

<What,1> <do,1> <you,1> <mean,1> <by,1> <Object,1>
<What,1> <do,1> <you,1> <know,1> <about,1> <Java,1>
<What,1> <is,1> <Java,1> <Virtual,1> <Machine,1>
<How,1> <Java,1> <enabled,1> <High,1> <Performance,1>

Giai đoạn Combiner đọc từng cặp khóa-giá trị, kết hợp các từ chung làm khóa và giá trị dưới dạng tập hợp. Thông thường, mã và hoạt động của Bộ kết hợp tương tự như của Bộ giảm tốc. Sau đây là đoạn mã cho khai báo lớp Mapper, Combiner và Reducer.

job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);

Output - Sản lượng dự kiến ​​như sau -

<What,1,1,1> <do,1,1> <you,1,1> <mean,1> <by,1> <Object,1>
<know,1> <about,1> <Java,1,1,1>
<is,1> <Virtual,1> <Machine,1>
<How,1> <enabled,1> <High,1> <Performance,1>

Pha giảm tốc

Giai đoạn Bộ giảm nhận từng cặp thu thập khóa-giá trị từ giai đoạn Bộ kết hợp, xử lý nó và chuyển đầu ra dưới dạng các cặp khóa-giá trị. Lưu ý rằng chức năng của Bộ kết hợp giống như Bộ giảm tốc.

Input - Cặp khóa-giá trị sau là đầu vào được lấy từ pha Combiner.

<What,1,1,1> <do,1,1> <you,1,1> <mean,1> <by,1> <Object,1>
<know,1> <about,1> <Java,1,1,1>
<is,1> <Virtual,1> <Machine,1>
<How,1> <enabled,1> <High,1> <Performance,1>

Giai đoạn Bộ giảm đọc từng cặp khóa-giá trị. Sau đây là đoạn mã cho Combiner.

public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> 
{
   private IntWritable result = new IntWritable();
   
   public void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException 
   {
      int sum = 0;
      for (IntWritable val : values) 
      {
         sum += val.get();
      }
      result.set(sum);
      context.write(key, result);
   }
}

Output - Đầu ra dự kiến ​​từ giai đoạn Bộ giảm tốc như sau:

<What,3> <do,2> <you,2> <mean,1> <by,1> <Object,1>
<know,1> <about,1> <Java,3>
<is,1> <Virtual,1> <Machine,1>
<How,1> <enabled,1> <High,1> <Performance,1>

Người viết ghi

Đây là giai đoạn cuối cùng của MapReduce trong đó Record Writer ghi mọi cặp khóa-giá trị từ giai đoạn Giảm và gửi đầu ra dưới dạng văn bản.

Input - Mỗi cặp khóa-giá trị từ giai đoạn Bộ giảm cùng với định dạng Đầu ra.

Output- Nó cung cấp cho bạn các cặp khóa-giá trị ở định dạng văn bản. Sau đây là kết quả mong đợi.

What           3
do             2
you            2
mean           1
by             1
Object         1
know           1
about          1
Java           3
is             1
Virtual        1
Machine        1
How            1
enabled        1
High           1
Performance    1

Chương trình mẫu

Khối mã sau đây đếm số từ trong một chương trình.

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WordCount {
   public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>
   {
      private final static IntWritable one = new IntWritable(1);
      private Text word = new Text();
      
      public void map(Object key, Text value, Context context) throws IOException, InterruptedException 
      {
         StringTokenizer itr = new StringTokenizer(value.toString());
         while (itr.hasMoreTokens()) 
         {
            word.set(itr.nextToken());
            context.write(word, one);
         }
      }
   }
   
   public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> 
   {
      private IntWritable result = new IntWritable();
      public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException 
      {
         int sum = 0;
         for (IntWritable val : values) 
         {
            sum += val.get();
         }
         result.set(sum);
         context.write(key, result);
      }
   }
   
   public static void main(String[] args) throws Exception 
   {
      Configuration conf = new Configuration();
      Job job = Job.getInstance(conf, "word count");
		
      job.setJarByClass(WordCount.class);
      job.setMapperClass(TokenizerMapper.class);
      job.setCombinerClass(IntSumReducer.class);
      job.setReducerClass(IntSumReducer.class);
		
      job.setOutputKeyClass(Text.class);
      job.setOutputValueClass(IntWritable.class);
		
      FileInputFormat.addInputPath(job, new Path(args[0]));
      FileOutputFormat.setOutputPath(job, new Path(args[1]));
		
      System.exit(job.waitForCompletion(true) ? 0 : 1);
   }
}

Lưu chương trình trên thành WordCount.java. Việc biên dịch và thực hiện chương trình được đưa ra dưới đây.

Biên dịch và Thực hiện

Giả sử chúng ta đang ở trong thư mục chính của người dùng Hadoop (ví dụ: / home / hadoop).

Làm theo các bước dưới đây để biên dịch và thực thi chương trình trên.

Step 1 - Sử dụng lệnh sau để tạo thư mục lưu các lớp java đã biên dịch.

$ mkdir units

Step 2- Tải xuống Hadoop-core-1.2.1.jar, được sử dụng để biên dịch và thực thi chương trình MapReduce. Bạn có thể tải xuống jar từ mvnrepository.com .

Giả sử thư mục đã tải xuống là / home / hadoop /.

Step 3 - Sử dụng các lệnh sau để biên dịch WordCount.java chương trình và để tạo một jar cho chương trình.

$ javac -classpath hadoop-core-1.2.1.jar -d units WordCount.java
$ jar -cvf units.jar -C units/ .

Step 4 - Sử dụng lệnh sau để tạo thư mục đầu vào trong HDFS.

$HADOOP_HOME/bin/hadoop fs -mkdir input_dir

Step 5 - Sử dụng lệnh sau để sao chép tệp đầu vào có tên input.txt trong thư mục đầu vào của HDFS.

$HADOOP_HOME/bin/hadoop fs -put /home/hadoop/input.txt input_dir

Step 6 - Sử dụng lệnh sau để xác minh các tệp trong thư mục đầu vào.

$HADOOP_HOME/bin/hadoop fs -ls input_dir/

Step 7 - Sử dụng lệnh sau để chạy ứng dụng Word count bằng cách lấy các tệp đầu vào từ thư mục đầu vào.

$HADOOP_HOME/bin/hadoop jar units.jar hadoop.ProcessUnits input_dir output_dir

Chờ một lúc cho đến khi tệp được thực thi. Sau khi thực thi, đầu ra chứa một số phân tách đầu vào, tác vụ Bản đồ và tác vụ Bộ giảm.

Step 8 - Sử dụng lệnh sau để xác minh các tệp kết quả trong thư mục đầu ra.

$HADOOP_HOME/bin/hadoop fs -ls output_dir/

Step 9 - Sử dụng lệnh sau để xem kết quả đầu ra trong Part-00000tập tin. Tệp này được tạo bởi HDFS.

$HADOOP_HOME/bin/hadoop fs -cat output_dir/part-00000

Sau đây là kết quả do chương trình MapReduce tạo ra.

What           3
do             2
you            2
mean           1
by             1
Object         1
know           1
about          1
Java           3
is             1
Virtual        1
Machine        1
How            1
enabled        1
High           1
Performance    1