4. 맵리듀스
4.1 MapReduce의 실행 과정
맵 : (k1, v1) → list(k2, v2)
리듀스 : (k2, list(v2)) → list(k3, v3)
4.1.1 입력데이터
read a book
write a book
4.1.2 맵으로 변환(key: line number, value: 문장)
1, read a book
2, write a book
4.1.3 정렬과 병합(key: 단어, value: 단어수)
<read, 1>
<a, 1>
<book, 1>
<write, 1>
<a, 1>
<book, 1>
4.1.4 Reduce(key: 단어, value: 단어수의 리스트)
<read, (1)>
<a, (1, 1)>
<book, (1, 1)>
<write, (1)>
4.1.5 실행 결과(key: 단어, value: 리스트의 합계)
<read, 1>
4.2 맵리듀스 프로그래밍 요소
4.2.1 데이터 타입
맵리듀스 프로그램에서 키와 값으로 사용되는 모든 데이터 타입은 반드시 WritableComparable 인터페이스를 구현해야 함
1) WritableComparable 인터페이스를 구현한 Wrapper 클래스 목록
클래스명 |
데이터 타입 |
BooleanWritable |
Boolean |
ByteWritable |
단일 Byte |
DoubleWritable |
Double |
FloatWritable |
Float |
IntWritable |
Int |
LongWritable |
Long |
TextWritable |
UTF-8 형식의 문자열 |
NullWritable |
데이터 값이 필요없을 경우 사용 |
2) InputFormat
InputFormat |
기능 |
TextInputFormat |
텍스트 파일을 분석할 때 사용 개행문자를 기준으로 레코드 분류 Key : Line Number(LongWritable 타입) Value : Line의 내용(Text 타입) |
KeyValueTextInputFormat |
텍스트 파일을 분석할 때 라인 번호가 아닌 임의의 key를 사용 |
NLineInputFormat |
텍스트 파일의 라인수를 제한할 때 사용 |
DelegatingInputFormat |
여러 개의 서로 다른 입력 포맷을 사용할 경우 각 경로에 대한 작업을 위임 |
SequenceFileInputFormat |
SequenceFile을 입력받을 경우 사용 SequenceFile - 바이너리 형태의 키와 값의 목록으로 구성된 텍스트 파일 |
SequenceFileAsBinaryInputFormat |
SequenceFile의 키와 값을 임의의 바이너리 객체로 변환하여 사용 |
SequenceFileAsTextInputFormat |
SequenceFile의 키와 값을 Text 객체로 변환해서 사용 |
2) Mapper
key와 value로 구성된 입력 데이터를 전달받아 데이터를 가공하고 분류해 새로운 데이터 목록을 생성
3) Partitioner
맵 태스트의 출력 데이터가 어떤 리듀스 태스트로 전달될지 결정
4) Reducer
Map Task의 출력 데이터를 입력 데이터로 전달받아 집계 연산 수행
5) Combiner
Mapper의 출력 데이터를 입력 데이터로 전달받아 연산을 수행하여 Shuffle할 데이터의 크기를 줄일 경우 사용
Shuffle : Map Task와 Reduce Task 사이의 데이터 전달 과정
6) OutputFormat
OutputFormat |
기능 |
TextOutputFormat |
텍스트 파일에 레코드를 출력할 때 사용 Key와 Value의 구분자는 탭 문자 |
SequenceFileOutputFormat |
SequenceFile을 출력물로 사용할 경우 |
SequenceFileAsBinaryOutputFormat |
바이너리 포맷의 Key와 Value를 사용 |
FilterOutputFormat |
OutputFormat 클래스를 편리하게 사용할 수 있는 method 제공 |
NullOutputFormat |
출력 데이터가 없을 때 사용 |
4.3 실습 예제(WordCount)
4.3.1 count.MyMapper.java
4.3.3 count.WordCount.java