Hadoop Shuffle Combiner

HadoopBeginner
지금 연습하기

소개

우주 전투 시뮬레이션 시스템에서 데이터를 관리하는 유능한 엔지니어라고 상상해 보세요. MapReduce 프로세스에서 Hadoop Shuffle Combiner 기술을 구현하여 시스템 성능을 최적화하는 것이 목표입니다. Combiner 를 활용하여 시뮬레이션 중 네트워크 트래픽을 줄이고 전반적인 데이터 처리 효율성을 향상시키는 것을 목표로 합니다.

Mapper 작성

이 단계에서는 입력 데이터를 처리하고 중간 키 - 값 쌍을 내보내기 위해 Mapper 클래스를 작성합니다.

터미널을 열고 아래 단계를 따라 시작하십시오.

사용자를 hadoop로 변경한 다음 hadoop 사용자의 홈 디렉토리로 전환합니다.

su - hadoop

Mapper 클래스에 대한 Java 파일을 생성합니다.

nano /home/hadoop/SpaceBattleMapper.java

그런 다음 다음 코드를 SpaceBattleMapper.java 파일에 추가합니다.

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Mapper.Context;
import java.io.IOException;

public class SpaceBattleMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        // Split the input line into words
        String[] words = value.toString().split("\\s+");
        // Emit a key-value pair for each word
        for (String w : words) {
            word.set(w);
            context.write(word, one);
        }
    }
}

: 오른쪽 프롬프트 상자에서 코드를 복사하여 Ctrl + Shift + V를 사용하여 열린 nano 편집기에 붙여넣을 수 있습니다. Ctrl + O를 눌러 파일을 저장하고 nano 편집기에서 메시지가 표시되면 Enter를 눌러 확인합니다. 마지막으로 Ctrl + X를 사용하여 편집기를 종료합니다.

SpaceBattleMapper 클래스는 Hadoop 프레임워크의 Mapper 클래스를 확장합니다. 키 - 값 쌍 형식의 입력 데이터를 처리하는 데 사용되며, 여기서 키는 입력 파일의 줄 바이트 오프셋을 나타내는 LongWritable이고 값은 텍스트 줄을 나타내는 Text 객체입니다.

이 클래스는 두 개의 private 필드를 정의합니다.

  • one: 상수 값 1 을 갖는 IntWritable 객체입니다. 이는 내보낸 키 - 값 쌍의 값으로 사용됩니다.
  • word: 입력 줄에서 추출된 각 단어를 저장하는 데 사용되는 Text 객체입니다.

map 메서드는 특정 매핑 로직을 제공하기 위해 재정의됩니다.

  • 입력 Text 값은 문자열로 변환되고 공백을 기준으로 단어로 분할됩니다.
  • 배열의 각 단어에 대해 word 객체는 해당 단어로 설정되고 단어를 키로, one을 값으로 하는 키 - 값 쌍이 내보내집니다. 이는 context.write 메서드를 사용하여 수행됩니다.

이 Mapper 클래스는 입력 데이터의 각 단어에 대해 키 - 값 쌍을 내보내도록 설계되었으며, 단어를 키로, 정수 1 을 값으로 사용합니다. 이 설정은 데이터 세트에서 각 단어의 발생 횟수를 계산하는 것이 목표인 단어 수 세기 애플리케이션에서 일반적으로 사용됩니다.

Combiner 구현

이 단계에서는 데이터 셔플링 전에 로컬 집계를 수행하기 위해 Combiner 클래스를 구현합니다.

Combiner 클래스에 대한 Java 파일을 생성합니다.

nano /home/hadoop/SpaceBattleCombiner.java

그런 다음 다음 코드를 SpaceBattleCombiner.java 파일에 추가합니다.

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;

public class SpaceBattleCombiner extends Reducer<Text, IntWritable, Text, IntWritable> {
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int sum = 0;
        // Sum up the values for each key
        for (IntWritable val : values) {
            sum += val.get();
        }
        // Emit the key and the sum of its values
        context.write(key, new IntWritable(sum));
    }
}

SpaceBattleCombiner 클래스는 Hadoop 프레임워크의 Reducer 클래스를 확장합니다. MapReduce 프로세스에서 Mapper 가 내보낸 중간 키 - 값 쌍의 로컬 집계를 수행하는 Combiner 로 사용됩니다.

이 클래스는 특정 Combiner 로직을 제공하기 위해 reduce 메서드를 재정의합니다.

  • 이 메서드는 Text 유형의 키와 IntWritable 유형의 값의 iterable 을 입력으로 사용합니다. 키는 단어를 나타내고, iterable 은 해당 단어의 발생 횟수를 포함합니다.
  • 이 메서드는 값을 반복하여 합산하여 단어의 총 개수를 구합니다.
  • 마지막으로, 이 메서드는 context.write 메서드를 사용하여 단어를 키로, 총 개수를 값으로 하는 키 - 값 쌍을 내보냅니다.

SpaceBattleCombiner의 목적은 데이터가 Reducer 로 네트워크를 통해 셔플링되기 전에 각 단어에 대한 카운트를 로컬에서 집계하는 것입니다. 이렇게 하면 Mapper 와 Reducer 단계 간에 전송되는 데이터 양이 줄어들어 MapReduce 작업의 효율성이 향상됩니다.

Reducer 구현

이 단계에서는 키 - 값 쌍의 최종 집계를 수행하기 위해 Reducer 클래스를 구현합니다.

  1. Reducer 클래스에 대한 Java 파일을 생성합니다.
nano /home/hadoop/SpaceBattleReducer.java

그런 다음 다음 코드를 SpaceBattleReducer.java 파일에 추가합니다.

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;

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

SpaceBattleReducer 클래스는 Hadoop 프레임워크의 Reducer 클래스를 확장합니다. Mapper 가 내보내고 선택적으로 Combiner 가 처리한 중간 키 - 값 쌍의 최종 집계를 수행하는 데 사용됩니다.

이 클래스는 특정 reducer 로직을 제공하기 위해 reduce 메서드를 재정의합니다.

  • 이 메서드는 Text 유형의 키와 IntWritable 유형의 값의 iterable 을 입력으로 사용합니다. 키는 단어를 나타내고, iterable 은 해당 단어의 발생 횟수를 포함합니다.
  • 이 메서드는 값을 반복하여 합산하여 단어의 총 개수를 구합니다.
  • 마지막으로, 이 메서드는 context.write 메서드를 사용하여 단어를 키로, 총 개수를 값으로 하는 키 - 값 쌍을 내보냅니다.

SpaceBattleReducer는 데이터의 최종 집계를 수행하여 모든 Mapper 출력에서 각 단어에 대한 카운트를 합산합니다. 이를 통해 입력 데이터에서 각 단어의 최종 발생 횟수를 얻을 수 있습니다.

Driver 작성

이 단계에서는 MapReduce 작업을 관리하기 위해 Java 파일을 생성합니다. 여기에는 작업 구성 설정 및 Mapper, Combiner 및 Reducer 클래스 지정을 포함합니다.

Driver 클래스에 대한 Java 파일을 생성합니다.

nano /home/hadoop/SpaceBattleDriver.java

그런 다음 다음 코드를 SpaceBattleDriver.java 파일에 추가합니다.

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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class SpaceBattleDriver {
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "Space Battle Simulation");
        job.setJarByClass(SpaceBattleDriver.class);
        job.setMapperClass(SpaceBattleMapper.class);
        job.setCombinerClass(SpaceBattleCombiner.class);
        job.setReducerClass(SpaceBattleReducer.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);
    }
}

SpaceBattleDriver 클래스는 우주 전투 시뮬레이션을 위한 MapReduce 작업을 구성하고 실행하는 역할을 합니다.

  • 이 클래스는 먼저 새 Configuration 객체와 이 구성을 사용하여 Job 인스턴스를 생성합니다. 작업에는 식별을 위해 "Space Battle Simulation"이라는 이름이 지정됩니다.

  • setJarByClass 메서드는 작업에 필요한 클래스를 포함하는 jar 파일을 설정하기 위해 SpaceBattleDriver 클래스와 함께 호출됩니다.

  • setMapperClass, setCombinerClasssetReducerClass 메서드는 각각 매핑, 결합 및 축소 작업을 수행할 클래스를 지정하는 데 사용됩니다.

  • setOutputKeyClasssetOutputValueClass 메서드는 이 경우 TextIntWritable인 출력 키와 값의 유형을 정의합니다.

  • FileInputFormat.addInputPathFileOutputFormat.setOutputPath 메서드는 입력 및 출력 데이터의 경로를 설정합니다. 이러한 경로는 main 메서드에 명령줄 인수로 전달됩니다.

  • 마지막으로, job.waitForCompletion 메서드는 작업을 제출하고 완료될 때까지 기다리기 위해 호출됩니다. 작업이 성공적으로 완료되면 메서드는 true를 반환하고, 그렇지 않으면 false를 반환합니다. 작업이 성공하면 프로그램은 상태 코드 0 으로 종료되고, 그렇지 않으면 1 로 종료됩니다.

이 driver 클래스는 MapReduce 작업의 모든 구성 요소를 연결하며 작업을 실행하기 위한 진입점입니다.

요약

이 Lab 에서는 우주 전투 시뮬레이션 시나리오에서 Hadoop Shuffle Combiner 기술 구현을 살펴보았습니다. Mapper, Combiner, Reducer 및 Driver 클래스를 생성하는 단계를 따라 Hadoop MapReduce 환경에서 데이터 처리를 최적화하는 실질적인 경험을 얻었습니다. 이 Lab 은 빅 데이터 처리 작업에서 네트워크 오버헤드를 줄이고 계산 효율성을 향상시키는 데 대한 이해를 높이는 것을 목표로 했습니다.