ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 하둡(Hadoop) MR(MapReduce)란?
    Back-End/Hadoop 2024. 7. 25. 13:45
    반응형
     맵리듀스(MapReduce)는 하둡에서 대규모 데이터 세트를 분산 처리하기 위해 사용되는 프로그래밍 모델입니다. 이 모델은 두 가지 주요 단계인 맵(Map)과 리듀스(Reduce)로 구성됩니다. 각각의 단계가 어떻게 작동하는지, 그리고 이를 통해 데이터가 어떻게 처리되는지를 자세히 설명드리겠습니다.
    hadoop

    맵리듀스(MapReduce) 작업의 개요

    1. 맵(Map) 단계:
      • 입력 데이터를 작은 조각으로 나누고, 각 조각을 병렬로 처리하여 중간 결과를 생성합니다.
      • 맵 함수는 입력 데이터를 키-값 쌍으로 변환합니다.
    2. 셔플(Shuffle) 및 정렬(Sort):
      • 맵 단계에서 생성된 중간 결과를 키를 기준으로 정렬하고, 같은 키를 가진 값들을 모읍니다.
      • 이 단계는 자동으로 수행되며, 데이터가 리듀서로 전송되기 전에 일어납니다.
    3. 리듀스(Reduce) 단계:
      • 정렬된 중간 결과를 입력으로 받아, 같은 키를 가진 값을 합쳐 최종 결과를 생성합니다.
      • 리듀스 함수는 키-값 쌍을 다시 하나의 결과로 결합합니다.

    맵리듀스 작업의 세부 과정

    1. 데이터 입력

    맵리듀스 작업은 HDFS에 저장된 데이터를 입력으로 받습니다. 입력 데이터는 여러 개의 스플릿(split)으로 나뉘며, 각 스플릿은 맵 태스크(map task)에 의해 처리됩니다.

    2. 맵(Map) 단계

    맵 함수는 입력 데이터를 처리하여 중간 결과를 생성합니다. 예를 들어, 텍스트 파일에서 단어 빈도수를 계산하는 경우, 맵 함수는 각 단어를 키로, 단어의 빈도를 값으로 하는 키-값 쌍을 생성합니다.

    자바 코드 예시:

    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);
            }
        }
    }

    이 예시에서는 텍스트를 토큰화하여 각 단어의 등장 횟수를 1로 설정하고, 단어를 키로, 1을 값으로 하는 키-값 쌍을 생성합니다.

    3. 셔플(Shuffle) 및 정렬(Sort)

    맵 단계에서 생성된 모든 중간 결과는 셔플과 정렬 과정을 거칩니다. 이 단계에서는 동일한 키를 가진 모든 값이 같은 리듀서로 전송되도록 정렬됩니다. 이는 분산된 맵 작업의 결과를 통합하는 중요한 과정입니다.

    4. 리듀스(Reduce) 단계

    리듀스 함수는 셔플과 정렬 단계를 거친 중간 결과를 받아서 최종 결과를 생성합니다. 예를 들어, 단어 빈도수를 계산하는 작업에서는 같은 단어를 키로 가지는 모든 값을 합산하여 단어의 총 빈도수를 계산합니다.

    자바 코드 예시:

    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);
        }
    }

    이 예시에서는 리듀스 함수가 같은 단어를 키로 가지는 값들을 합산하여 단어의 총 빈도수를 계산합니다.

    5. 데이터 출력

    리듀스 단계에서 생성된 최종 결과는 HDFS에 저장됩니다. 출력 파일은 일반적으로 여러 개의 파일로 분할되어 저장됩니다.

    맵리듀스 작업의 예제

    전체적인 맵리듀스 작업을 하나의 예제로 설명하겠습니다. 이 예제는 단어 빈도수를 계산하는 간단한 맵리듀스 작업입니다.

    1. 맵(Map) 단계: 텍스트 파일을 읽고 각 단어를 키로, 단어의 등장 횟수를 값으로 설정합니다.
    2. 셔플 및 정렬: 동일한 단어를 키로 가지는 모든 값을 모읍니다.
    3. 리듀스(Reduce) 단계: 각 단어의 등장 횟수를 합산하여 최종 결과를 생성합니다.
    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;
    import java.io.IOException;
    import java.util.StringTokenizer;
    
    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);
        }
    }

    요약

    • 맵(Map) 단계: 데이터를 분할하고, 키-값 쌍을 생성하여 병렬 처리합니다.
    • 셔플(Shuffle) 및 정렬(Sort): 중간 결과를 정렬하고 같은 키를 가진 값을 그룹화합니다.
    • 리듀스(Reduce) 단계: 그룹화된 중간 결과를 처리하여 최종 결과를 생성합니다.
    Hello world
    Hello Hadoop
    Hadoop is a big data framework
    World of big data

     

    • 입력 데이터:
      • HDFS에 텍스트 파일 형식으로 저장 (input.txt).
    • 맵(Map) 단계:
      • 입력 데이터를 키-값 쌍으로 변환 (예: "Hello world" -> ("Hello", 1), ("world", 1)).
    • 셔플 및 정렬:
      • 동일한 키를 가진 값들을 그룹화 (예: ("Hello", [1, 1])).
    • 리듀스(Reduce) 단계:
      • 그룹화된 값을 합산하여 최종 결과 생성 (예: ("Hello", 2)).

     

    맵리듀스는 하둡의 핵심 기능 중 하나로, 대규모 데이터를 병렬로 처리하여 효율적으로 분석할 수 있게 합니다. 이를 통해 복잡한 데이터 처리 작업을 단순하고 효과적으로 수행할 수 있습니다.

    반응형

    'Back-End > Hadoop' 카테고리의 다른 글

    하둡(Hadoop)으로 데이터 저장 추출해보기  (0) 2024.07.25
    하둡(Hadoop)이란?  (0) 2024.07.25
Designed by Tistory.