빅데이터/하둡

하둡 1.0 튜토리얼 - (15) 전체정렬

_금융덕후_ 2019. 7. 18. 20:58
728x90
반응형

 

전체 정렬

전체 정렬이란 입력 데이터를 먼저 개발자가 샘플링 해서 데이터의 분포도를 조사한 뒤,

미리 파티션의 갯수와 파티션에 저장할 데이터의 범위를 조사한 분포에 맞게 정해주는 정렬 방법입니다.

이때 분포와 파티션 정보가 잘 들어맞는다면 분산환경의 장점을 살려 좋은 효율을 내겠지만,

계산법이 틀렸다면, 특정 파티션에 데이터가 집중되면서 그 리듀스 태스크는 부하가 걸려 오래걸리게 됩니다.

 

전체정렬은 결국 다른 방식으로 부분정렬을 하고, 그 부분정렬을 모두 합치면 전체정렬이 완성됩니다.

정렬의 관점에서만 보면 전체정렬이 더 낫다고 볼 수 있으나,

부분정렬은 검색이 용이하다는 장점이 있기 때문에 각각의 용도가 다르다고 보면 됩니다.

 

전체정렬 구현

전체 정렬은 시퀀스파일이 이미 생성되었다는 것을 전제로 진행됩니다.

분포도에 맞게 샘플링을 하는 작업은 InputSampler를 사용해 진행됩니다.

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.filecache.DistributedCache;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.compress.GzipCodec;
import org.apache.hadoop.mapred.*;
import org.apache.hadoop.mapred.lib.InputSampler;
import org.apache.hadoop.mapred.lib.TotalOrderPartitioner;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

import java.net.URI;

public class SequenceFileTotalSort extends Configured implements Tool {
    public static void main(String[] args) throws Exception{
        int res = ToolRunner.run(new Configuration(), new SequenceFileTotalSort(), args);
        System.out.println("MR-Job Result:"+res);
    }

    public int run(String[] args) throws Exception {
        JobConf conf = new JobConf(getConf(), SequenceFileTotalSort.class);
        conf.setJobName("SequenceFileTotalSort");

        // 입출력 포맷
        conf.setInputFormat(SequenceFileInputFormat.class);
        conf.setOutputFormat(SequenceFileOutputFormat.class);
        conf.setOutputKeyClass(IntWritable.class);
        conf.setPartitionerClass(TotalOrderPartitioner.class);

        // 시퀀스 압축 파일 포맷
        SequenceFileOutputFormat.setCompressOutput(conf, true);
        SequenceFileOutputFormat.setOutputCompressorClass(conf, GzipCodec.class);
        SequenceFileOutputFormat.setOutputCompressionType(conf, SequenceFile.CompressionType.BLOCK);

        FileInputFormat.setInputPaths(conf, new Path(args[0]));
        FileOutputFormat.setOutputPath(conf, new Path(args[1]));

        // 파티션 설정
        Path inputDir = FileInputFormat.getInputPaths(conf)[0];
        inputDir = inputDir.makeQualified(inputDir.getFileSystem(conf));
        Path partitionFile = new Path(inputDir, "_partitions");
        TotalOrderPartitioner.setPartitionFile(conf, partitionFile);

        // 샘플링 추출
        InputSampler.Sampler<IntWritable, Text> sampler = new InputSampler.RandomSampler<>(0.1, 1000, 10);
        InputSampler.writePartitionFile(conf, sampler);

        URI partitionUri = new URI(partitionFile.toString() + "#_partitions");
        DistributedCache.addCacheFile(partitionUri, conf);
        DistributedCache.createSymlink(conf);

        JobClient.runJob(conf);

        return 0;
    }
}

 

전체정렬 실행

이제 jar빌드를 하고 scp를 사용해 파일을 전송해줍니다.

그리고 아래 커맨드를 사용해 실행해줍니다.

> hadoop jar totalSort.jar com.jyoon.study.totalSort.SequenceFileTotalSort 2008_sequencefile 2008_totalSort

 

이 작업은 하나의 파일을 만들어냅니다.

파일의 내용을 확인해 정렬이 되었는지 확인하겠습니다.

> hadoop fs -text 2008_totalSort/part-00000 | head -10

 

이 작업의 결과는 다음과 같습니다.

11      2008,8,10,7,1315,1220,1415,1320,OH,5572,N819CA,60,60,14,55,55,JFK,LGA,11,8,38,0,,0,55,0,0,0,0
11      2008,5,15,4,2037,1800,2125,1900,OH,4988,N806CA,48,60,31,145,157,JFK,LGA,11,10,7,0,,0,145,0,0,0,0
21      2008,5,9,5,48,100,117,130,AA,588,N061AA,29,30,11,-13,-12,MIA,FLL,21,6,12,0,,0,NA,NA,NA,NA,NA
24      2008,3,12,3,955,931,1021,948,9E,2009,91619E,26,17,10,33,24,IAH,HOU,24,7,9,0,,0,0,0,9,0,24
24      2008,11,27,4,943,940,1014,956,9E,5816,91469E,31,16,9,18,3,IAH,HOU,24,5,17,0,,0,0,0,18,0,0
24      2008,1,2,3,1245,1025,1340,1125,OH,5610,N806CA,55,60,11,135,140,IAD,DCA,24,5,39,0,,0,135,0,0,0,0
30      2008,1,6,7,2226,2200,2301,2240,CO,348,N56859,35,40,11,21,26,SJC,SFO,30,7,17,0,,0,0,0,0,0,21
30      2008,1,8,2,816,805,907,855,B6,9002,N236JB,51,50,19,12,11,JFK,HPN,30,5,27,0,,0,NA,NA,NA,NA,NA
30      2008,9,22,1,1340,1325,1553,1425,OH,6898,N710CA,133,60,27,88,15,HPN,JFK,30,12,94,0,,0,0,0,88,0,0
30      2008,8,8,5,1448,1440,1602,1540,OH,5052,N442CA,74,60,23,22,8,HPN,JFK,30,9,42,0,,0,0,0,22,0,0

 

참고자료

이 포스팅은 "시작하세요! 하둡 프로그래밍" 책의 예제를 무작정 따라해본 포스팅입니다.

https://wikibook.co.kr/beginning-hadoop-programming-2rev/

728x90
반응형