JOIN ID AND TITLE V2

 

개요

- 앞서 간략히 Distributed Cache라는 것에 대해 이야기했는데 이는 작은 사이즈의 읽기전용 파일(흔히 사전)을 task tracker에 working directory에 복사해주는 메커니즘을 말한다.

 

* Distributed Cache로 사용될 파일은 먼저 HDFS에 복사되고 그 위치가 사용되어야한다.

* Distributed Cache의 디폴트최대크기는 10GB인데 실질적으로 의미있는 최대크기는 100MB 정도.

 

사용전략

-어느파일을 Distributed Cache로 사용할 것인가?

* CountCitation의 실행 후 나온결과에 TopN을 돌려서 나온 결과를 distributed cache로 사용.

N이 작다면 이 파일의 크기는 작다.

* TopN의 결과 파일이 이미 HDFS에 있으므로 이들 그대로 사용한다.

- 프로그램의 인자로 이 distributed cache파일의 HDFS상의 위치를 넘긴다.

- Main함수에서 이 위치를 단순히 Distributed Cache로 등록한다.

- Mapper 실행시 setup 메소드에서 이 위치를 참조하여 파일을 오픈한다.

- 앞서 이야기했듯이 이 파일은 task의 실행 전에 HDFS에서 로컬파일 시스템으로 복사되기 때문에 그냥 로컬 텍스트 파일을 읽는 코드를 작성하여 ID를 키로 하여 해쉬맵에 빈도수를 값으로 저장한다.

 

- Mapper의 map 메소드에서 읽혀지는 Title ID 쌍에 대해 ID가 앞서 setup에서 만들어진 해쉬맵에 존재하는지 확인

* 존재하면 키를 타이틀로 하고 밸류는 DocID + "t"+빈도수로 해서 reducer로 내보낸다.

 

- 이 경우 Reducer는 딱히 할일이 없기 때문에 Identity Reducer를 지정한다.

 

 

COUNT CITATION

 

개요

 

- 앞서본 2M.SPCID.DSTID를 바탕으로 가장 많이 레퍼런스된 위키피디아 페이지의 분서 번호가 뭔지 알아낸다.

 

- 기본적으로 word count와 흡사

* Map으로 들어오는 (srclD, dstID)pair를 (dstID, 1)pair로 바꿔서 넘기고 Reduce에서 단순히 dstID로 들어온 value단의 값을 합한다.

* 작업의 특성상 combiner의 적용이 가능.

 

Map 코드

 

public static class Map extends Mapper<Text, Text, Text, IntWritable> {

private final static IntWritable one = new IntWritable(1);

public void map(Text key, Text value, Context context)throws IOException, InterruptedException {

context.write(value, one);

}

}

 

Reduce 코드

 

public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable>{

public void reduce(Text key, lterable<IntWritable>values, Context context)

throws IOEception, interruptedException{

int sum=0;

fot (IntWritable val : values)

sum +=val.get();

context.write(key,new intWritable(sum));

}

}

 

실행결과

 

앞서 결과에 TopN Job을 실행하여 추출된 top 10 DoclD

 

18951490        9536

38523            10900

5405             12187

9239             12545

3383             13632

5407             15945

15573            21453

14532            23075

14533            24610

9316              34884

 

 

 

 

 

빅데이터공부하기는 it개발자스터디공간을 이용해주세요 ^^

학원을 알아보신다면 --> www.oraclejava.co.kr

 

 

 

빅데이터공부하기 44-1 입력포맷클래스..

명절 다들 잘 보내셨나요??^^

쉬는날은 빨리지나가죠...

오늘도 빅데이터 공부를 모두 파이팅하면서 시작합시다!!

 

이건 복싑이죠 ><

KeyValueTextInputFormat

 

- TextInputFormat과 흡사

 

- 텍스트라인에서 키와 밸류가 tab문자를 사이에 두고 나뉘었다고 가정.

키와 밸류는 모두 Text타입

 

- tab이외의 다른 문자를 delimiter로 사용시

Configuration의 "key.value.separator.in.input.line"프로퍼티를 해당

문자로 설정

 

 

 

 

 

 

SequenceFileInputFormat

 

- SequenceFile포맷의 파일을 읽어들일때 사용하는 포맷

SequenceFile : 하둡 고유의 바이내리 키/ 밸류기반 압축지원 파일포맷.

키와 밸류는 어떤 타입이건 가능

 

특히 여러 하둡잡들을 체인닝하여 작업을 할때 굉장히유용(퍼포먼스 측면)

 

- 퍼포먼스를 고려하면 반드시 사용해야할 입력포맷

 

 

기타 입력파일 지정방법

 

- MultipleInputs.addInputPath

간혹 입력파일들에 따라 다른 mapper를 지정하면 일이 단순해지는 경우가 존재

 

입력파일에 따라 다른 입력포맷과 mapper를 지정가능

 

 

빅데이터공부하기 31-2 WordCount 의사코드

 

지난글에 이어서 WordCount의사코드에 대해 공부하겠습니다.

 

빅데이터공부는 ORACLEJAVA IT공부하자에서 하세요 ^--^

 

 

WordCount의사코드

 

public static class Map extends Mapper<LongWritable, Text, Text, LongWritable>                                             1                        2

{

private final static LongWriable one = new LongWriable(1);

private Text word = new Text();

                    3

 

public void map(LongWriable key, Text value, Context context)

throws IOException, InterruptedException

{

String Iine = value.toString();

String Tokenizer tokenizer = new String Tokenizer(line, " , "\t\r\n\f |,.\"");

while (tokenizer.hasMore Tokens())

{

word set(tokenizer.nextToken().toLowerCase());

context.wrie(word, one);          4

}

}

 

 

1. 입력레코드의 키, 밸류 타입은 인풋포맷이 결정하며 앞서 main에서 보면 TextlnputFormat을 사용. LongWritable, Text등은 자바의 Long과 String 타입의 하둡용 랩퍼.

 

2. 출력레코드의 키, 밸류 타입은 Text, LongWriable인 데 이건 프레임웍에 의해 소팅, 셔플링이 된다음에 reducer로 넘어간다.

 

3. map 메소드내에서 사용할 변수를 두개 미리 만들어둔다.

 

4. map 메소드는 밸류로 넘어온 텍스트 파일의 라인을 String Tokenizer 클래스를 이용해 파싱한 다음 각 단어들을 하나씩 프레임웍으로 넘긴다.

(키는 단어, 밸류는 1)

 

 

빅데이터공부하기 31-2 WordCount 의사코드

빅데이터공부하기 31-1 WordCount 의사코드

 

Wordcount의사코드에 대해서 계속 공부해보겠습니다.

 

WordCount 의사코드

 

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

{

Configuration conf = new Configuration();             

     Job job=new Job(conf, "word count");

 

job.setJarByClass(WordCount.class);

    job.setMapperClass(Map.class);

job.setReducerClass(Reduce.class);

 

job.setOutputKeyClass(Test.class);

job.setOutputValueClass(LongWritable.class);

 

job.setInputFormatClass(TextInputFormat.class);

 job.setOutputFormatClass(TextOutputFormat.class);

 

FilelnputFormat.addlinputPath(job, new Path(args[0]));

 FileOutputFormat.setOutputPath(job, new Path(args[0]));

 

job.watiForCompletion(true);

}

 

 

 

다음글에서도 빅데이터공부하기는 계속됩니다.^^

 

 

+ Recent posts