[java] 자바와 아파치 하둡의 맵리듀스 프로그래밍

소개

아파치 하둡은 대용량 데이터를 처리하기 위한 분산 데이터 처리 플랫폼으로, 맵리듀스라는 프로그래밍 모델을 기반으로 동작합니다. 맵리듀스는 데이터 처리 작업을 여러 개의 작은 블록으로 나눠서 병렬로 처리하는 방식으로, 빠른 속도와 확장성을 제공합니다. 이번 포스트에서는 자바를 사용하여 아파치 하둡의 맵리듀스 프로그래밍을 소개하겠습니다.

맵리듀스 개요

맵리듀스는 크게 두 단계로 이루어져 있습니다. 첫 번째 단계는 “맵(Map)” 단계로, 입력 데이터를 여러 개의 작은 조각으로 나누고 각각의 조각에 대해 맵 함수를 적용하여 중간 결과를 생성합니다. 두 번째 단계는 “리듀스(Reduce)” 단계로, 맵 단계에서 생성된 중간 결과를 조합하여 최종 결과를 생성하는 리듀스 함수를 적용합니다.

맵리듀스 프로그래밍 모델

아파치 하둡에서 맵리듀스 프로그래밍을 하려면 다음과 같은 단계를 따라야 합니다.

1. 맵 함수 구현

먼저 맵 함수를 자바로 구현해야 합니다. 이 함수는 입력 데이터 한 개에 대해 적용되어 중간 결과를 생성합니다. 맵 함수는 Mapper 클래스를 상속받아서 구현하며, map() 메서드를 재정의하여 로직을 작성합니다.

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class MyMapper extends Mapper<LongWritable, Text, Text, LongWritable> {
  
  private final Text outKey = new Text();
  private final LongWritable outValue = new LongWritable(1);
  
  @Override
  protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    String line = value.toString();
    // 입력 데이터를 처리하여 중간 결과 생성
    // outKey와 outValue에 결과 값을 설정
    context.write(outKey, outValue);
  }
}

2. 리듀스 함수 구현

다음으로 리듀스 함수를 자바로 구현해야 합니다. 리듀스 함수는 맵 단계에서 생성된 중간 결과를 입력으로 받아 최종 결과를 생성합니다. 리듀스 함수는 Reducer 클래스를 상속받아서 구현하며, reduce() 메서드를 재정의하여 로직을 작성합니다.

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class MyReducer extends Reducer<Text, LongWritable, Text, LongWritable> {

  private final LongWritable outValue = new LongWritable();

  @Override
  protected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {
    long count = 0;
    // 입력 데이터를 처리하여 최종 결과 생성
    // count에 결과 값을 설정
    outValue.set(count);
    context.write(key, outValue);
  }
}

3. 드라이버 클래스 작성

맵리듀스 작업을 실행하기 위해 드라이버 클래스를 작성해야 합니다. 이 클래스는 Job 객체를 생성하고 맵과 리듀스 함수를 설정하여 작업을 실행합니다.

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;

public class MapReduceDriver {

  public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
    Configuration conf = new Configuration();
    Job job = Job.getInstance(conf, "MapReduce Example");

    job.setJarByClass(MapReduceDriver.class);
    job.setMapperClass(MyMapper.class);
    job.setReducerClass(MyReducer.class);

    job.setInputFormatClass(TextInputFormat.class);
    job.setOutputFormatClass(TextOutputFormat.class);

    TextInputFormat.addInputPath(job, new Path(args[0]));
    TextOutputFormat.setOutputPath(job, new Path(args[1]));

    job.setMapOutputKeyClass(Text.class);
    job.setMapOutputValueClass(LongWritable.class);

    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(LongWritable.class);

    System.exit(job.waitForCompletion(true) ? 0 : 1);
  }
}

실행

위의 코드들을 자신의 프로젝트에 추가한 후, 입력 데이터와 결과 파일의 경로를 인자로 넘겨서 MapReduceDriver 클래스를 실행하면 맵리듀스 작업이 실행됩니다.

결론

이번 포스트에서는 자바를 사용하여 아파치 하둡의 맵리듀스 프로그래밍에 대해 소개했습니다. 맵리듀스는 대용량 데이터 처리에 매우 유용한 프로그래밍 모델이며, 자바로 간단히 구현할 수 있습니다. 맵리듀스를 활용하여 빠르고 효율적인 데이터 처리를 경험해보세요.

참고 자료