본문 바로가기

Hadoop

Hadoop - MapReduce 프로그래밍

MapReduce 프로그래밍은 개발자가 직접 해야한다.

 

=자바(Java)

  • MapReduce 프로그램을 가장 완벽하게 작성 가능
  • 객체 지향 언어
  • 많은 개발 경험 필요
  • 가장 많은 코드량 발생

= 하이브(Hive)

  • SQL로 하둡 데이터를 분석하려는 SNS 엔지니어들의 요구로 SNS 내부에서 개발되었다가 오픈 소스로 공개됨
  • 데이터 요약, 쿼리 및 분석을 제공하기 위해 하둡 위에 구축된 데이터웨어 하우스 소프트웨어 프로젝트

= 피그 (Pig)

  • 하둡의 복잡한 추출, 변환, 적재 작업을 손쉽게 함
  • 다수의 중간 결과물이 필요한 복잡한 분석 쿼리에도 적합
  • 대량의 조인 연산이나 중간 테이블이 필요한 경우에 주로 사용
  • 관계형 기본 함수 및 사용자 정의 함수로 기능 확장 가능

 

= MapReduce Java 프로그래밍 예제

: Map, Reduce, Driver(Main) 3개의 클래스가 반드시 구현되어야 함.

  • MapReduce에서의 인자는 일반 long, int, String 타입을 사용하지 않으며, 대신 LongWritable, IntWritable, Text 라는 하둡 전용 자료형을 사용
    (전송을 가능하게 바이트별로 보내는 솔루션이 내장되어있기 때문)

 

Mapper Class Example

package hadoop;

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

public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
    // Map 출력키
    private Text outputKey = new Text();
    // Map 출력값
    private final static IntWritable outputValue = new IntWritable(1);

    @Override
    protected void map(LongWritable inputKey, Text inputValue, Mapper<LongWritable, Text, Text, IntWritable>.Context context)
            throws IOException, InterruptedException {
        StringTokenizer itr = new StringTokenizer(inputValue.toString());
        while (itr.hasMoreTokens()) {
            // 출력키 설정
            outputKey.set(itr.nextToken());
            // 출력 데이터 생성
            context.write(outputKey, outputValue);
        }
    }
}
  • Mapper 클래스를 상속.

 

Reduce Class Example

package hadoop;

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

public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    private IntWritable result = new IntWritable();

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

 

 

Job Class Example

package hadoop;

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

public class WordCount {
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        if (args.length != 2) {
            System.out.println("Usage: WordCount <input> <output>");
            System.exit(2);
            ;
        }
        Job job = new Job(conf, "WordCount"); // Job 이름 설정
        job.setJarByClass(WordCount.class); // Job 클래스 설정
        job.setMapperClass(WordCountMapper.class); // Mapper 클래스 설정
        job.setReducerClass(WordCountReducer.class); // Reducer 클래스 설정
        // 입출력 데이터 포맷 설정
        job.setInputFormatClass(TextInputFormat.class);
        job.setOutputFormatClass(TextOutputFormat.class);
        // 출력키 및 출력값 유형 설정
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        // 입출력 데이터 경로 설정
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));

        job.waitForCompletion(true); // 실행
    }
}

 

 

= 참고링크

'Hadoop' 카테고리의 다른 글

Hadoop - HDFS 명령어  (0) 2021.09.13
Hadoop - ubuntu에 하둡 설치하기  (0) 2021.09.13
Hadoop - 하둡이란??  (0) 2021.09.13