소개
우주 전투 시뮬레이션 시스템에서 데이터를 관리하는 유능한 엔지니어라고 상상해 보세요. MapReduce 프로세스에서 Hadoop Shuffle Combiner 기술을 구현하여 시스템 성능을 최적화하는 것이 목표입니다. Combiner 를 활용하여 시뮬레이션 중 네트워크 트래픽을 줄이고 전반적인 데이터 처리 효율성을 향상시키는 것을 목표로 합니다.
우주 전투 시뮬레이션 시스템에서 데이터를 관리하는 유능한 엔지니어라고 상상해 보세요. MapReduce 프로세스에서 Hadoop Shuffle Combiner 기술을 구현하여 시스템 성능을 최적화하는 것이 목표입니다. Combiner 를 활용하여 시뮬레이션 중 네트워크 트래픽을 줄이고 전반적인 데이터 처리 효율성을 향상시키는 것을 목표로 합니다.
이 단계에서는 입력 데이터를 처리하고 중간 키 - 값 쌍을 내보내기 위해 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 클래스에 대한 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 클래스를 구현합니다.
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 출력에서 각 단어에 대한 카운트를 합산합니다. 이를 통해 입력 데이터에서 각 단어의 최종 발생 횟수를 얻을 수 있습니다.
이 단계에서는 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, setCombinerClass 및 setReducerClass 메서드는 각각 매핑, 결합 및 축소 작업을 수행할 클래스를 지정하는 데 사용됩니다.
setOutputKeyClass 및 setOutputValueClass 메서드는 이 경우 Text 및 IntWritable인 출력 키와 값의 유형을 정의합니다.
FileInputFormat.addInputPath 및 FileOutputFormat.setOutputPath 메서드는 입력 및 출력 데이터의 경로를 설정합니다. 이러한 경로는 main 메서드에 명령줄 인수로 전달됩니다.
마지막으로, job.waitForCompletion 메서드는 작업을 제출하고 완료될 때까지 기다리기 위해 호출됩니다. 작업이 성공적으로 완료되면 메서드는 true를 반환하고, 그렇지 않으면 false를 반환합니다. 작업이 성공하면 프로그램은 상태 코드 0 으로 종료되고, 그렇지 않으면 1 로 종료됩니다.
이 driver 클래스는 MapReduce 작업의 모든 구성 요소를 연결하며 작업을 실행하기 위한 진입점입니다.
이 Lab 에서는 우주 전투 시뮬레이션 시나리오에서 Hadoop Shuffle Combiner 기술 구현을 살펴보았습니다. Mapper, Combiner, Reducer 및 Driver 클래스를 생성하는 단계를 따라 Hadoop MapReduce 환경에서 데이터 처리를 최적화하는 실질적인 경험을 얻었습니다. 이 Lab 은 빅 데이터 처리 작업에서 네트워크 오버헤드를 줄이고 계산 효율성을 향상시키는 데 대한 이해를 높이는 것을 목표로 했습니다.