본문 바로가기
Data Base/Hadoop

[Hadoop] : SequenceFile 프로그래밍

by 오주현 2022. 5. 17.
반응형

RecordReader 객체가 생성될 때 Map을 나눈다.

 

RecordReader를 더 엄밀히 말 하면 LineRecordReader로 라인별로 Key와 Value를 나누고 Mapper를 호출한다.

아래 세 가지가 가장 많이 사용되는 InputFormat이다.

  1. FileInputFormat
  2. KeyValueTextInputFormat
  3. SequenceFileInputFormat

시퀸스 파일이란?

  • 효율적인 맵리듀스 수행을 위해 생성된 파일 형태
    • 맵리듀스는 64mb 단위로 블록을 나눠서 하둡분산파일시스템에 저장한다.
    • 저장되는 파일의 블록단위가 64mb보다 작은 경우 하둡분산파일시스템에 낭비되는 데이터 공간 및 맵리듀스 실행시 성능 저하가 발생한다.
  • 파일 구조는 key,value 형태로 구현된다.
    • 맵 형태
  • 시퀀스 파일에서 제공하는 파일 타입은 크게 3가지이다.
    • 압축되지 않은 파일 타입
    • 레코드 단위 압축된 파일 타입
    • 블럭단위 압축된 파일 타입
  • 맵리듀스 분석 및 처리 전, 미리 배치를 통해 시퀀스 파일을 생성하는 것이 데이터저장 및 처리에 있어 매우 효율적이다.
  • 시퀸스 파일을 사용하기 위한 파일 포멧
    • SequenceFileInputFormat(읽기)
    • SequenceFileOutputFormat(쓰기)

드라이버 파일만 작성한다. 매퍼, 리듀서를 생성하지 않는다.

기본 Map 함수를 활요앻 기존 파일의 변환 처리만 수행한다.


package hadoop.MapReduce.seq;

import lombok.extern.log4j.Log4j;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
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.mapreduce.lib.output.SequenceFileOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

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

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

        if (args.length != 2) {
            log.info("변환할 원본 파일(폴더)과 시퀀스파일로 변환될 파일(폴더)를 입력해야 합니다.");
            System.exit(-1);
        }

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

        System.exit(exitCode);
    }

    @Override
    public void setConf(Configuration conf) {

        // App 이름 정의
        conf.set("AppName", "SequenceFile Create 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(CreateSequenceFile.class);

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

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

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

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

        // 리듀서 객체를 생성하지 못 하도록 객체의 수를 0 으로 정의
        job.setNumReduceTasks(0);
        // 맵리듀스 실행
        boolean success = job.waitForCompletion(true);

        return (success ? 0 : 1);
    }
}
  • CreateSequenceFile.java

Map 함수로 스퀀스 파일이 생성되기 때문에 part-m으로 생성된다.

 

시퀀스 파일을 맵리듀스의 RecordReader가 읽을 수 있는 형태로 변환하기 때문에 Key 값에 바이트 단위 값이 들어간다. → 개발자가 파일 내용을 보기에 불편하다.

반응형

댓글