[java] 자바와 아파치 하둡의 맵리듀스 태스크 구현 방법

아파치 하둡은 대규모 데이터 세트를 처리하기 위한 분산 처리 시스템으로 유명하다. 맵리듀스는 하둡의 핵심 기능 중 하나로, 데이터를 병렬로 처리하여 속도와 확장성을 향상시킨다. 이번 블로그 포스트에서는 자바와 아파치 하둡을 사용하여 맵리듀스 태스크를 구현하는 방법에 대해 알아보겠다.

1. 맵리듀스란?

맵리듀스는 대규모 데이터 세트를 처리하기 위한 분산 처리 모델로, 입력 데이터를 여러 조각으로 나누어 맵(map) 함수로 처리한 후 리듀스(reduce) 함수를 거쳐 최종 결과를 도출한다. 맵 함수는 입력 데이터를 키-값 쌍으로 변환하고, 리듀스 함수는 키를 기준으로 데이터를 그룹화하여 처리한다.

2. 맵리듀스 태스크의 구현 방법

아파치 하둡에서 맵리듀스 태스크를 구현하기 위해 다음과 같은 단계를 따라야 한다.

2.1 맵 함수 구현

자바에서 맵 함수를 구현하기 위해서는 Mapper 클래스를 확장해야 한다. 맵 함수는 map 메서드에 구현되며, 입력 데이터의 한 줄을 입력으로 받아 원하는 형태로 변환한 후 Context 객체에 출력한다.

public class MyMapper extends Mapper<LongWritable, Text, Text, IntWritable> {

  @Override
  public void map(LongWritable key, Text value, Context context)
    throws IOException, InterruptedException {
    
    // 입력 데이터를 원하는 형태로 변환
    // 예: "apple,banana,grape" -> {"apple" -> 1, "banana" -> 1, "grape" -> 1}
    
    String line = value.toString();
    String[] words = line.split(",");
    
    for (String word : words) {
      context.write(new Text(word), new IntWritable(1));
    }
  }
}

2.2 리듀스 함수 구현

자바에서 리듀스 함수를 구현하기 위해서는 Reducer 클래스를 확장해야 한다. 리듀스 함수는 reduce 메서드에 구현되며, 키와 해당 키에 대한 모든 값들을 입력으로 받아 원하는 형태로 처리한 후 Context 객체에 출력한다.

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

  @Override
  public void reduce(Text key, Iterable<IntWritable> values, Context context)
    throws IOException, InterruptedException {
    
    // 키와 해당 키의 값들을 처리하여 결과 도출
    // 예: {"apple" -> [1, 1], "banana" -> [1], "grape" -> [1]}
    
    int sum = 0;
    for (IntWritable value : values) {
      sum += value.get();
    }
    
    context.write(key, new IntWritable(sum));
  }
}

2.3 드라이버 프로그램 구현

맵리듀스 태스크를 실행하기 위해선 드라이버 프로그램을 구현해야 한다. 드라이버 프로그램은 Job 객체를 생성하고, 맵 함수, 리듀스 함수, 입력 및 출력 경로 등을 설정한 후 Job 객체를 실행한다.

public class MapReduceDriver {

  public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();

    Job job = Job.getInstance(conf, "MapReduce Example");
    job.setJarByClass(MapReduceDriver.class);
    
    job.setMapperClass(MyMapper.class);
    job.setReducerClass(MyReducer.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);
  }
}

위에서는 MyMapper 클래스와 MyReducer 클래스를 맵 함수와 리듀스 함수로 설정하였고, 입력과 출력 경로를 커맨드 라인 인자로 받는 예시 코드이다.

3. 결론

이번 블로그 포스트에서는 자바와 아파치 하둡을 사용하여 맵리듀스 태스크를 구현하는 방법에 대해 알아보았다. 맵과 리듀스 함수를 구현하고, 드라이버 프로그램을 작성하여 맵리듀스 작업을 실행할 수 있다. 이를 통해 대규모 데이터 처리를 효율적으로 수행할 수 있게 된다.

더 자세한 내용은 아파치 하둡 공식 문서를 참고해보세요.