빅데이터공부하기 Top N의 글입니다.

 

우선순위큐(PriorityQueue)

 

우선순위를 가진 항목들을 저장하는 큐

일반 FIFO 큐나 스택과는 달 리 우선 순위가 높은 데이터가 먼저 나가게됨

예제에서는 자바 util의 PriorityQueue 클래스를 이용

- PriorityQueue에 저장될 개체타입을 ITemFreq로 정의하고 초기 크기는 10으로 지정. 또한 개체간의 비교에 사용될 Comparator도 지정

 

Mapper와 reducer의 시작부분에서 두개의 변수 생성

comparator<ItemFreq>comparator=new ITemFreqComparator();

PriorityQueue<ITemFreq>queue=new PriorityQueue<ITemFreq>(10, comparator);

 

ItemFreq클래스

 

이 클래스는 PriorityQueue, Mapper와 Reducer에도 키로 사용

- WritableComparable 인터페이스 구현

 

빅데이터공부하기 54_1 Top N

 

이번글부터는 Top N 을 공부하도록하겠습니다.

 

개요

 

앞서 WordCount2의 실행결과에서 가장 높은 빈도수를 갖는 10개의 단어는?

두번째 필드가 숫자로 빈도수를 나타낸다는 전제하에 동작(범용적)

동작방식

- 각 mapper에서 들어오는 레코드들을보고 Top N개만 출력.

- Reducer에서 결국 같은 작업을 반복

- Top N개의 레코드를 가려내기위해 PriorityQueue를 사용

* 모두를 다 저장하고나서 소팅하는 것은 메모리낭비가 너무 큼

- 모든 입력레코드의 처리가 끝난 후에야 Top N개를 알 수 있으므로 Mapper와 Reducer의 cleanup 메소드에서 PriorityQueue의 내용을 출력

 

만일 전체 데이터를 빈도수로 소팅하고 싶다면 다른 전략이 필요

- 하둡제공 예제 프로그램중에 TeraSort라는 것의 구현을 흉내내면됨. 하둡의 벤치마크로 널리 쓰이는 프로그램

- 데이터 샘플링 후 파티션(Partitioner)을 어떤 값 기준으로 나눌지 정하는 형태. 이는 아주 흔히 쓰이는 하둡 잡 실행 전략 중의 하나

 

 

 

word count v2 2번째 글입니다.

 

Combiner의 동작확인

 

Job의 출력에서 Map-Reduce Framework 카운터들중에 다음 2개를 확인

_ Combine Input Records

- Combine Output Records

 

둘을 비교해보면 Combine Output Records의 값이 훨씬 작다.

- Combine Input Records의 경우 Mapper의 Output Records인 셈인데 Mapper의 Output Records보다 그 값이 큰데 그 이유는 Combiner는 Mapper Output이 merqu될 때마다 지속적으로 적용되기 때문이다.

 

12/08/06 12:31:37 INFO mapred.JobClient: Map output records=417,783,208

12/08/06 12:31:37 INFO mapred.JobClient: Combine input records=460,692,608

12/08/06 12:31:37 INFO mapred JobClient: Combine output records=53,872,927

 

 

카운터 사용

 

- 예를 들어 유일한 단어수를 카운트하고 싶다면 reduce 메소드에서 context.write다음에 다음 코드를 삽입

* context.getCounter("Wrods Stats", "Unique words").increment(1);

 

- JobTracker나 콘솔 출력에서 카운터의 수를 확인가능

 

 

 

빅데이터공부하기 53번째 글입니다.

이번글은 word count v2에 대해서 공부하겠습니다.

 

개요.

 

- 2M 영문 위키피디아 페이지(2M.ID.CONTENTS)들에 있는 단어들의 수를 빈도수를 계산

- 앞서 본 WordCount와 크게 안 다름. 몇 가지 차이점

- 입력파일의 형태가 다름. ID/tContent.ID는 그냥 무시.

- KeyValueTextInputFormat을 입력포맷으로 사용.

- Combiner를 사용 (Reducer를 그대로 적용)

* Combiner는 mapper 출력에 적용되는 로컬 reducer! 교환법칙과 결합법칙 성립 오퍼레이션에만 적용가능

- 카운터 사용

 

코드

 

- main 함수에서의 변경

- job.setCombinerClass(Reduce.class);

- job.setinputFormatClass(KeyValueTextInputFormat.class);

 

- Map 클래스의 변경

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

{

....

 

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

 

 

빅데이터공부하기 52_1 위키피디아 데이터 다운로드

 

데이터 다운로드

- 앞서 위치에서 파일을 다운로드받고 압출 해제 후 data 디렉토리로 이동

- 앞으로 예제프로그램들의 실행을 위해서 이 파일들을 HDFS로 복사

(/input 디렉토리로 복사시 아래 명령 실행)

* hadoop fs-copyFromLocal */input

 

 

다음 글에서는 word count v2를 공부하도록하겠습니다. ^^

 

11월3일 오늘 ... 너무 추워요 ㅠ0ㅠ

정말.. 겨울이 왔나봐요!! 저는 겨울보다 여름이 좋은데.. ㅠㅠ 다들 감기조심하세요 ^^

 

 

 

빅데이터공부하기 52번째글입니다.

 

위키파디아 _ 데이터준비

 

앞으로 예제 프로그램들에서 사용할 데이터들을 설명

Freebase에서 다운로드 된 영문 wikipedia문서들을 대상으로 함.

- 한글문서를 하고 싶었지만 괞찬은 무료형태소분석기를 못찾았습니다. ㅜ

 

다음파일을 다운로드

- wget

https://s3.amazonaws.com/hadoopkr/data.tar.gz

 

싱글서버 하둡을 쓰는 경우를 고려해 처음 2M개의 문서데이터 사용하여 다음 파일들을 생성

- 2M.TITLE.ID

* 각 라인마마 문서타이틀과 문서 ID가 나열 (Tab). 둘다 유니크.

 

-2M.ID.CONTENTS

* 각 문서들 마다 들어있는 링크들을 다음과 같은 형태로 정리

- 링크텍스트/ t소스문서ID

 

* 한 문서에 들어있는 링크텍스트의 수만큼 위의 패턴이 반복

 

- 2M.ID.CONTENTS

* 각 라인마다 "소스문서 ID /t타켓문서ID"가 나열됨. 이는 문서간의 링크관계를 나타냄

 

- RandomString.txt

* 임의의 문자열이 들어간 텍스트파일. 7장 StringSort에서 사용.

 

 

 

 

보너스 : MRUnit

 

- Cloudera에서 개발한 MapReduce를 위한 오픈소스 유닛테스트 프레임웍.

 

- JUnit과 같은 표준 자바 테스트툴과 MapReduce 프레임웍간의 손쉬운 통합 지원

 

- http://mrunit.apache.org

 

 

WordCountTest.java

 

암 세션에서 제공한 WordCount 프로젝트의 일부로 제공한 MRUnit기반 유닛테스트 코드

- WordCount의 mapper와 reducer의 기능을 샘플데이터로 테스트

 

빌드 프로세스의 일부로 실행

- "mvn test" or "mvn install"

 

Unit Test는 Continuous Integration에서 아주 중요!!

 

 

 

 

빅데이터공부하기 51_4 MRUnit / WordCountTest.java

 

지낙 빅데이터공부하기 51_2 번째 글에서 Mapper Task Log를 공부했었는데요.

이번에는 Task Log 페이지에 대해서 알아보도록하겠습니다.

 

Task Log 페이지

 

 

Mapper/Reducer timeout

 

만일 task가 오래동안 아무 "소식"이 없으면 tasktracker는 그 잡이 문제가 있다고 생각하고 중지.

- "소식" : 입력 읽기, 출력쓰기 혹은 상태 리포트, 타운터 증가 등등

 

- 오래 걸리는 것이 예상된다면 해결책은

* timeout 증가(mapred.task.timeout). 디폰트는 10분

* 종종 tasktracker로 살아있다고 핑 보내기

- Mapper.Context나 Reducer.Context의 progress 혹은 setStatus 메소드 호출

+ Recent posts