본문 바로가기
Data Base/Hadoop

[Hadoop] : ToolRunner 사용하기

by 오주현 2022. 5. 3.
반응형
  • 툴러너는 맵리듀스에 필요한 사용자 정의 변수 등을 활용하기 위해 사용한다.
    • 맵리듀스 전체 전역 변수 활용에 사용.
  • 툴러너를 통해 정의한 Configuration 객체는 Mapper, Reducer 객체에서도 사용이 가능하다.
    • Mapper와 Reducer는 setup과 cleanup 함수를 통해 활용
  • 툴러너?
    • 기존 드라이버 파일에 환경설정 관련 내용을 감싸서 처리한다.

  • 기존 드라이버 파일에 환경설정 관련 내용을 감싸서 처리한다.
  • 툴러너 관련 import 자바 객체
import org.apache.hadoop.conf.Configured; (클래스)
import org.apache.hadoop.conf.Configuration; (클래스)
import org.apache.hadoop.util.Tool; (인터페이스)
import org.apache.hadoop.util.ToolRunner; (클래스)

 

사용.

  • Configured 상속
  • Tool 구현
  • Run 함수 구현
  • Main 함수 수정
    • Run 함수 수행하도록 변경
  • 주요 설정은 Driver 파일에 적용한다.
package hadoop.MapReduce.tool;

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;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

/**
 * 맵리듀스를 실행하기 위한 Main 함수가 존재하는 자바 파일
 * 드라이버 파일로 부름
 */
public class WordCount2 extends Configuration implements Tool {

    public static void main(String[] args) throws Exception {

        if (args.length != 2) {
            System.out.println("분석할 폴더(파일) 및 분석 결과가 저장될 폴더를 입력해야 합니다.");
            System.exit(-1);
        }

        int exitCode = ToolRunner.run(new WordCount2(), args);

        System.exit(exitCode);
    }

    @Override
    public void setConf(Configuration conf) {

        // App 이름 정의
        conf.set("AppName", "ToolRunner Test");

    }

    @Override
    public Configuration getConf() {

        //맵리듀스 전체에 적용될 변수를 정의할 때 사용
        Configuration conf = new Configuration();

        //변수 정의
        this.setConf(conf);

        return conf;
    }

    @Override
    public int run(String[] args) throws Exception {

        Configuration conf = this.getConf();
        String appName = conf.get("AppName");

        System.out.println("appName = " + appName);

        // 맵리듀스 시랳ㅇ을 위한 잡 객체를 가져온다.
        // 하둡이 실행되면, 기본적으로 잡 객체를 메모리에 올린다.
        Job job = Job.getInstance(conf);

        // 맵리듀스 잡이 시작되는 main 함수가 존재하는 파일 설정
        job.setJarByClass(WordCount2.class);

        // 맵리듀스 잡 이름 설정, 리소스 매니저 등 맵리듀스 실행 결과 및 로그 확인할 때 편리
        job.setJobName(appName);

        // 분석할 폴더(파일) -- 첫 번째 파라미터
        FileInputFormat.setInputPaths(job, new Path(args[0]));

        // 분석 결과가 저장되는 폴더(파일) -- 두 번째 파라미터
        FileOutputFormat.setOutputPath(job, new Path(args[1]));

        // 맵리듀스의 맵 역할을 수행하는 Mapper 자바 파일 설정
        job.setMapperClass(WordCount2Mapper.class);

        // 맵리듀스의 리듀스 역할을 수행하는 Reducer 자바 파일 설정
        job.setReducerClass(WordCount2Reducer.class);

        // 분석 결과가 저장될 때 사용될 키의 데이터 타입
        job.setOutputKeyClass(Text.class);

        // 분석 결과가 저장될 때 사용될 값의 데이터 타입
        job.setOutputValueClass(IntWritable.class);

        // 맵리듀스 실행
        boolean success = job.waitForCompletion(true);
        return (success ? 0 : 1);
    }
}

WordCount2.java

 

package hadoop.MapReduce.tool;

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 java.io.IOException;


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

    @Override
    protected void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException {

        // 분석할 파일의 한 줄 값
        String line = value.toString();

        // 단어 빈도수 구현은 공백을 기준으로 단어로 구분함
        // 분석할 한 줄 내용을 공부개으로 나눔
        // word 변수는 공백을 나눠진 단어가 들어감

        for (String word : line.split("\\W+")) {
            if (word.length() > 0) {
                // Suffle and Sort로 데이터를 전달하기
                // 전달하는 값은 단어와 빈도수(1)를 전달달
                context.write(new Text(word), new IntWritable(1));
            }
        }
    }
}

WordCount2Mapper.java

 

package hadoop.MapReduce.tool;

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

import java.io.IOException;

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

    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context)
            throws IOException, InterruptedException {


        int wordCount = 0;

        for (IntWritable value : values) {
            wordCount += value.get();
        }

        context.write(key, new IntWritable(wordCount));
    }
}

WordCount2Reducer.java

 

hadoop jar mr.jar hadoop.MapReducer.tool.WordCount2 /comedies /result4

기존에 업로드 된 mr.jar 파일을 삭제하고 새로 빌드하고 hadoop에 넣어준다.

 

hadoop fs -ls /result4

hadoop fs -cat /result4/*

툴러너 적용 결과를 실행해 본다.

 

https://ohju96.notion.site/ToolRunner-9d8c6cd6c0764ec39b6b56e69c8b712b

 

ToolRunner 사용

툴러너는 맵리듀스에 필요한 사용자 정의 변수 등을 활용하기 위해 사용한다.

ohju96.notion.site

 

반응형

댓글