3장. HDFS입출력과 맵리듀스
1. 자바 프로젝트 빌드 및 jar 파일생성
* 이클립스 src폴더 아래 FileWriteRead.java 작성 및 빌드
* 실행가능한 JAR 파일생성
2. 맵리듀스 개념
* 맵과 리듀스 개념
* 맵리듀스 시스템 구성
* 작업 메커니즘
- 굳이 namenode에 구성할 필요 없음. 별도의 서버 가능
- 잡트래커는 몇 개의 맵과 리듀스를 실행할지 계산,
- 잡트래커는 어떤 태스크트래커에서 실행할지 결정.(해당 태스크트래커에 잡 할당)
- 태스크트래커는 잡트래커 작업수행요청을 받아 맵리듀스 프로그램 실행
- 잡트래커와 태스크트래커는 heartbeat 매서드로 (상태와 실행정보) 네트워크 통신
- 태스크트래커 장애시, 잡트래커는 다른 대기중인 태스크트래커를 찾아 작업 재실행
- 태스크트래커 : datanode에서 실행되는 데몬으로 맵리듀스 프로그램 실행
- 태스크트래커는 잡트래처가 요청한 맵과 리듀스 개수만큼 맵테스크와 리듀스태스크 생성
- 맵태스크와 리듀스태스크 : 사용자가 설정한 맵과 리듀스 프로그램
- 맵태스크와 리듀스태스크가 생성되면 새로운 jvm을 구동해서 실행
- 태스크를 실행하기위한 jvm은 재사용가능
- 데이터노드를 하나만 구성했더라도, 여러개의 jvm을 실행시켜서 병렬 처리 작업 가능.
* 맵리듀스 작동방식
- 설명
1) 사용자 job 실행정보 설정 → Wait For Completion 메서드 호출 → MapReduce job 실행
2) 신규잡 제출
ㄴ job 인터페이스에서 새로운 job클라이언트객체 생성 → jobtracker접속, job 실행요청
ㄴ jobtracker는 job클라이언트에게 새로운 job id 반환
ㄴ job클라이언트는 사용자 설정한 출력경로 확인 (존재하는 경로입력시, 에러발생/종료)
3) 입력 스플릿 생성
ㄴ job 클라이언트는 job에 입력 데이터에 대한 입력 스플릿 계산
ㄴ 입력스플릿 정의 : 하나의 map에서 처리해야 하는 입력 파일 크기
ㄴ 하둡은 맵리듀스의 job의 입력데이터를 입력스플릿 고정크기의 조각으로 분리
ㄴ 이때 생성된 입력스플릿마다 Map task 하나씩 생성, Map task의 입력데이터로 전달
ㄴ 입력데이터가 hdfs 기본블록사이즈 64MB보다 큰 경우에만 생성.
ㄴ mapred-site.xml에서 크기 수정 가능 (mapred.min.split.sizeproperty)
ㄴ 기본값은 0byte
ㄴ 분리작업하면 작업시간단축, 더많은 스플릿이 생성될수록 부하분산효과가 커짐.
ㄴ but, 스플릿이 너무 작게생성되면, 관리와 Maptask를 생성하는 것 자체가 부하임.
ㄴ 입력스플릿 계산 후, 입력스플릿 정보와 설정파일, MapReduce jar 파일을 hdfs에 저장. jobtracker에게 job 시작준비 완료 신호 보냄.
4) 잡할당
ㄴ jobtracker는 job 클라이언트의 메시지 수신 후, job을 q에 등록.
ㄴ job스케줄러가 q를 초기화하고, 초기화한 뒤에 입력 스플릿 정보를 가져와 입력스플릿 개수만큼 Maptask생성 및 id 부여
ㄴ tasktracker는 주기적으로 jobtracker의 heartbeat로 상태정보를 jobtracker에 알림
ㄴ 상태정보 : cpu, 메모리, 디스크 등 서버가용리소스 정보, 실행중인 task수, 실행가능한 최대 task수, 신규task 실행 가능여부 등 실행정보
ㄴ jobtracker는 heartbeat로 tasktracker 잡할당을 결정하게 됨
5) Mapper 실행
ㄴ Tasktracker는 Joptracker가 할당한 Maptask를 실행
ㄴ Maptask는 사용자가 설정한 MapperClass, 입력스플릿은 키와 값의 형태로 Maptask에 입력데이터로 전달
ㄴ Maptask는 Map 메서드에 정의되어 있는 logic을 실행하고 출력데이터를 메모리 버퍼에 저장
ㄴ Partitioner는 해당 출력 데이터가 어떤 Reducetask에 전달되어야 할지 결정하고 그에 맞는 파티션을 지정
ㄴ 파티션에서는 메모리에 있는 데이터를 키에 따라 정렬 한후, 로컬디스크에 저장
6) 정렬, 병합
ㄴ 파티션별로 디스크 저장이완료되면 이파일들은 하나의 출력파일로 병합되고 정렬됨
7) 리듀서 실행
ㄴ Reducetask : 사용자가 설정한 Reducer Class
ㄴ Reducetask는 자신이 필요한 Maptask에 모든 출력 데이터가 있어야만 작업 시작
(Mapper 출력 = reduce 입력)
ㄴ Maptast는 출력이 완료되면 자신을 실행한 Tasktracker에게 작업 정상완료 알림. 그리고, 이 Tasktracker는 Jobtracker에게 해당 Maptask의 상태와 Maptask의 출력데이터 경로를 알림. 바로 Reducetask는 주기적으로 Jobtracker에게 Maptask의 출력데이터 경로를 확인함. 그를 통해 해당 출력 데이터를 local node에 복사. (이 때, 파일이 크다면 디스크로 복사, 작다면 메모리로 복사)
ㄴ Reducetask는 모든 Maptask의 출력 데이터를 복사한 뒤에 Maptask의 출력 데이터를 병합
ㄴ 병합완료 후, reduce메서드를 호출하여 분석로직을 실행
8) 출력 데이터 저장
ㄴ Reducetask는 출력데이터를 hdfs에 저장(part-nnnnn, 숫자 다섯개는 partition id, 1씩증가)
* 하둡 프로그래밍 요소
- 하둡 API 문서
http://hadoop.apche.org/docs/stable1/api
WritableComparable
InputFormat
TextInputFormat : 텍스트파일 분석시 사용
- Carriage Return 값 기준 레코드 분류 (1$n)
- 라인 값은 라인의 내용 : 텍스트타입
KeyValueTextInputFormat : 텍스트파일을 입력파일로 사용,
- 라인번호가 아닌 임의의 키값을 키로 지정하여 키와 값의 목록을 잃게 됨.
<Text,Text>
NLineInputFormat
- Maptask가 입력받을 task 파일의 라인 수를 제한 할 때 사용
DelegatingInputFormat
- 여러개의 서로다운 입력 포맷을 사용하는 경우에 각 경로에 대한 작업을 위임할 때 쓰는 Class
CombineFileInputFormat :
- InputFormat들은 파일당 스플릿을 생성하지만, CombineFileInputFormat 은 여러 개의 파일을 스플릿으로 묶어서 사용
- node와 rack의 위치를 고려해서 스플릿을 결정
SequenceFileInputFormat
- SequenceFile을 입력데이터로 쓸때 사용
- 바이너리 형태의 키와 값의 목록으로 구성된 텍스트 파일을 뜻함.
- SequenceFile은 압축과 직렬화 Framework를 이용해서 다양한 유형을 저장가능
SequenceFileAsBinaryInputFormat
- SequenceFile의 키와 값을 임의의 바이너리 객체로 변화시킴.
SequenceFileAsTextInputFormat
- SequenceFile의 키와 값을 텍스트 객체로 변환해서 사용
Mapper
- MapReduce 프로그래밍 모델에서 Map메서드의 기능 수행
- 키와 값으로 구성된 입력 데이터를 전달 받고, 이 데이터를 가공하고 분류해서 새로운 데이터 목록을 생성
- 입력 스플릿마다 하나의 Maptask를 생성
- 이 때 생성되는 Maptask가 바로 Mapper Class
- 그대로 사용하기 보다는 상속받아 Mapper Class를 새롭게 구현
- 아래처럼 generic parameter를 사용해서 Class를 정의( 각각 입력 키 유형을 뜻함)
- context객체를 통해 job에 대한 정보를 얻어오고, 입력 스플릿을 Record 단위로 읽음
- context 객체 생성자에 RecordReader를 선언하고 있음. 이부분을 통해 입력스플릿이 키와 값에 Record로 Map 메서드에 parameter로 전달되는 것임.
- Method는 4개로 구성
cleanup, map, run, setup
- map 메서드 선언부
- run 메서드 선언부
protected void cleanup(Mapper.Context context)
contect 객체에 있는 키를 순회하면서 Map 메서드 호출
Partitioner
- Maptask의 출력데이터가 어떤 reducetask로 전달될지 결정
- MapReduce 기본 Partitioner로 Hashpartitioner 지정되어있음
- 추상화 Classpartitioner를 상속받아 getPartition메서드 재정의하여 partition 번호를 받고 있음.
- Maptask에 출력키와 값 그리고 전체 reducetask의 개수를 parameter로 받아서 partition을 계산. return값이 partition number 가 됨.
- 이렇게 계산된 결과대로 Maptask가 실행된 node에 partition이 생성되고 Maptask에 출력 데이터가 저장됨.
- 모든 Maptask의 작업이 완료되면 partition에 저장된 데이터는 해당 reducetask로 네트워크로 전송
Reducer
- Maptask의 출력 데이터를 입력 데이터로 전달받아서 쉽게 연산 수행
- 다음과 같이 generic타입에 parameter를 정의
- Reducer.Contect 상세
public Reducer.Context(Configuration conf,
Map메서드의 출력결과도 Record단위로 만들수 있도록 RecordWriter를 파라미터로 전달받음
- reduce 메소드
protected void reduce(KEYIN key,
Combiner
- Maptask의 출력 데이터는 네트워크를 통해 Reducetask로 전달됨.
- 이러한 전달과정을 shuffle이라고 표현함.
- 네트워크로 전송되어야할 데이터 크기를 줄일수록 전체 job의 성능이 좋아짐
- Combiner Class는 shuffle 할 데이터의 크기를 줄이는 역할을 함.
- Combiner는 Mapper의 출력데이터를 입력데이터로 전달받아 연산을 수행하는데 local node의 출력 데이터를 생성한 후 reducetask의 네트워크로 전달
- 이 때, 출력 데이터는 기존 Mapper의 출력데이터보다 크기가 줄기 때문에 네트워크 비용도 줄어들고, reducer가 처리해야 될 데이터의 양도 줄어들어서 job의 성능이 좋아짐.
OutputFormat
- job interface의 메서드 중, setOutputFormatClass 메서드로 설정한 포맷대로 MapReduce job의 출력 데이터 포맷이 만들어지게 됨.
- 이부분에 OutputFormat이 있음.
- 이 때 사용하는 출력 Dataformat은 OutputFormat Class를 상속받아 구현된 것.
org.apache.hadoop.mapreduce.lib.output 패키지 조회
TextOutputFormat : 기본포맷
- textFile의 Record를 출력할 때 사용
- Record를 출력 할 때 키와 값의 구분자는 tab 사용
SequenceFileOutputFormat
- sequenceFile을 출력물로 쓸 때 사용
SequenceFileAsBinaryOutputFormat
- BinaryFormat의 키와 값을 sequenceFile container에 쓰도록 함.
FilterOutputFormat
- OutputFormat class의 Mapper Class
- 편리한 여러 메서드 제공
LazyOutputFormat
- FileOutputFormat을 상속받은 Class들은 출력할 내용이 없더라도 reduce에 출력파일을 생성
- 출력 파일은 part-nnnnn로 이루어짐
- LazyOutputFormat은 첫번째 Record가 해당 partition으로 보내질 때만 출력 파일을 생성하게 함.
NullOutputFormat
- 출력 데이터가 없을 때 사용
* 이클립스 src폴더 아래 FileWriteRead.java 작성 및 빌드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
package pj01.hadoop.chapter03;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class FileWriteRead {
public static void main(String[] args) {
if (args.length != 2) {
System.err.println("Usage: FileWriteRead <filename> <contents>");
System.exit(2);
}
try {
Configuration conf = new Configuration();
FileSystem hdfs = FileSystem.get(conf);
Path path = new Path(args[0]);
if (hdfs.exists(path)) {
hdfs.delete(path, true);
}
FSDataOutputStream outStream = hdfs.create(path);
outStream.writeUTF(args[1]);
outStream.close();
FSDataInputStream inputStream = hdfs.open(path);
String inputString = inputStream.readUTF();
inputStream.close();
System.out.println("# File Contents:" + inputString);
} catch (Exception e) {
e.printStackTrace();
}
}
}
| cs |
* 예제JAR 파일 실행 및 HDFS 저장/확인
1
2
3
4
5
6
7
8
9
10
|
[hduser@hdstudy01 hadoop]$ hadoop jar alzio-hadoop-examples.jar FileWriteRead.tst Hi
# File Contents : Hi
[hduser@hdstudy01 hadoop]$ hadoop fs -ls
Found 3 items
-rw-r--r-- 1 hduser supergroup 4 2017-06-10 00:06 /user/hduser/FileWriteRead.tst
-rw-r--r-- 1 hduser supergroup 0 2017-06-09 19:45 /user/hduser/newFile
drwxr-xr-x - hduser supergroup 0 2017-06-09 15:17 /user/hduser/wordcount_output
[hduser@hdstudy01 hadoop]$ hadoop fs -cat FileWriteRead.tst
Hi[hduser@hdstudy01 hadoop]$
| cs |
2. 맵리듀스 개념
* 맵과 리듀스 개념
* 맵리듀스 시스템 구성
* 작업 메커니즘
- 굳이 namenode에 구성할 필요 없음. 별도의 서버 가능
- 잡트래커는 몇 개의 맵과 리듀스를 실행할지 계산,
- 잡트래커는 어떤 태스크트래커에서 실행할지 결정.(해당 태스크트래커에 잡 할당)
- 태스크트래커는 잡트래커 작업수행요청을 받아 맵리듀스 프로그램 실행
- 잡트래커와 태스크트래커는 heartbeat 매서드로 (상태와 실행정보) 네트워크 통신
- 태스크트래커 장애시, 잡트래커는 다른 대기중인 태스크트래커를 찾아 작업 재실행
- 태스크트래커 : datanode에서 실행되는 데몬으로 맵리듀스 프로그램 실행
- 태스크트래커는 잡트래처가 요청한 맵과 리듀스 개수만큼 맵테스크와 리듀스태스크 생성
- 맵태스크와 리듀스태스크 : 사용자가 설정한 맵과 리듀스 프로그램
- 맵태스크와 리듀스태스크가 생성되면 새로운 jvm을 구동해서 실행
- 태스크를 실행하기위한 jvm은 재사용가능
- 데이터노드를 하나만 구성했더라도, 여러개의 jvm을 실행시켜서 병렬 처리 작업 가능.
* 맵리듀스 작동방식
- 설명
1) 사용자 job 실행정보 설정 → Wait For Completion 메서드 호출 → MapReduce job 실행
2) 신규잡 제출
ㄴ job 인터페이스에서 새로운 job클라이언트객체 생성 → jobtracker접속, job 실행요청
ㄴ jobtracker는 job클라이언트에게 새로운 job id 반환
ㄴ job클라이언트는 사용자 설정한 출력경로 확인 (존재하는 경로입력시, 에러발생/종료)
3) 입력 스플릿 생성
ㄴ job 클라이언트는 job에 입력 데이터에 대한 입력 스플릿 계산
ㄴ 입력스플릿 정의 : 하나의 map에서 처리해야 하는 입력 파일 크기
ㄴ 하둡은 맵리듀스의 job의 입력데이터를 입력스플릿 고정크기의 조각으로 분리
ㄴ 이때 생성된 입력스플릿마다 Map task 하나씩 생성, Map task의 입력데이터로 전달
ㄴ 입력데이터가 hdfs 기본블록사이즈 64MB보다 큰 경우에만 생성.
ㄴ mapred-site.xml에서 크기 수정 가능 (mapred.min.split.sizeproperty)
ㄴ 기본값은 0byte
ㄴ 분리작업하면 작업시간단축, 더많은 스플릿이 생성될수록 부하분산효과가 커짐.
ㄴ but, 스플릿이 너무 작게생성되면, 관리와 Maptask를 생성하는 것 자체가 부하임.
ㄴ 입력스플릿 계산 후, 입력스플릿 정보와 설정파일, MapReduce jar 파일을 hdfs에 저장. jobtracker에게 job 시작준비 완료 신호 보냄.
4) 잡할당
ㄴ jobtracker는 job 클라이언트의 메시지 수신 후, job을 q에 등록.
ㄴ job스케줄러가 q를 초기화하고, 초기화한 뒤에 입력 스플릿 정보를 가져와 입력스플릿 개수만큼 Maptask생성 및 id 부여
ㄴ tasktracker는 주기적으로 jobtracker의 heartbeat로 상태정보를 jobtracker에 알림
ㄴ 상태정보 : cpu, 메모리, 디스크 등 서버가용리소스 정보, 실행중인 task수, 실행가능한 최대 task수, 신규task 실행 가능여부 등 실행정보
ㄴ jobtracker는 heartbeat로 tasktracker 잡할당을 결정하게 됨
5) Mapper 실행
ㄴ Tasktracker는 Joptracker가 할당한 Maptask를 실행
ㄴ Maptask는 사용자가 설정한 MapperClass, 입력스플릿은 키와 값의 형태로 Maptask에 입력데이터로 전달
ㄴ Maptask는 Map 메서드에 정의되어 있는 logic을 실행하고 출력데이터를 메모리 버퍼에 저장
ㄴ Partitioner는 해당 출력 데이터가 어떤 Reducetask에 전달되어야 할지 결정하고 그에 맞는 파티션을 지정
ㄴ 파티션에서는 메모리에 있는 데이터를 키에 따라 정렬 한후, 로컬디스크에 저장
6) 정렬, 병합
ㄴ 파티션별로 디스크 저장이완료되면 이파일들은 하나의 출력파일로 병합되고 정렬됨
7) 리듀서 실행
ㄴ Reducetask : 사용자가 설정한 Reducer Class
ㄴ Reducetask는 자신이 필요한 Maptask에 모든 출력 데이터가 있어야만 작업 시작
(Mapper 출력 = reduce 입력)
ㄴ Maptast는 출력이 완료되면 자신을 실행한 Tasktracker에게 작업 정상완료 알림. 그리고, 이 Tasktracker는 Jobtracker에게 해당 Maptask의 상태와 Maptask의 출력데이터 경로를 알림. 바로 Reducetask는 주기적으로 Jobtracker에게 Maptask의 출력데이터 경로를 확인함. 그를 통해 해당 출력 데이터를 local node에 복사. (이 때, 파일이 크다면 디스크로 복사, 작다면 메모리로 복사)
ㄴ Reducetask는 모든 Maptask의 출력 데이터를 복사한 뒤에 Maptask의 출력 데이터를 병합
ㄴ 병합완료 후, reduce메서드를 호출하여 분석로직을 실행
8) 출력 데이터 저장
ㄴ Reducetask는 출력데이터를 hdfs에 저장(part-nnnnn, 숫자 다섯개는 partition id, 1씩증가)
* 하둡 프로그래밍 요소
- 하둡 API 문서
http://hadoop.apche.org/docs/stable1/api
WritableComparable
InputFormat
TextInputFormat : 텍스트파일 분석시 사용
- Carriage Return 값 기준 레코드 분류 (1$n)
<LongWritable,Text>- 키는 라인번호 : Longwritable 타입
- 라인 값은 라인의 내용 : 텍스트타입
KeyValueTextInputFormat : 텍스트파일을 입력파일로 사용,
- 라인번호가 아닌 임의의 키값을 키로 지정하여 키와 값의 목록을 잃게 됨.
<Text,Text>
NLineInputFormat
- Maptask가 입력받을 task 파일의 라인 수를 제한 할 때 사용
DelegatingInputFormat
- 여러개의 서로다운 입력 포맷을 사용하는 경우에 각 경로에 대한 작업을 위임할 때 쓰는 Class
CombineFileInputFormat :
- InputFormat들은 파일당 스플릿을 생성하지만, CombineFileInputFormat 은 여러 개의 파일을 스플릿으로 묶어서 사용
- node와 rack의 위치를 고려해서 스플릿을 결정
SequenceFileInputFormat
- SequenceFile을 입력데이터로 쓸때 사용
- 바이너리 형태의 키와 값의 목록으로 구성된 텍스트 파일을 뜻함.
- SequenceFile은 압축과 직렬화 Framework를 이용해서 다양한 유형을 저장가능
SequenceFileAsBinaryInputFormat
- SequenceFile의 키와 값을 임의의 바이너리 객체로 변화시킴.
SequenceFileAsTextInputFormat
- SequenceFile의 키와 값을 텍스트 객체로 변환해서 사용
Mapper
- MapReduce 프로그래밍 모델에서 Map메서드의 기능 수행
- 키와 값으로 구성된 입력 데이터를 전달 받고, 이 데이터를 가공하고 분류해서 새로운 데이터 목록을 생성
- 입력 스플릿마다 하나의 Maptask를 생성
- 이 때 생성되는 Maptask가 바로 Mapper Class
- 그대로 사용하기 보다는 상속받아 Mapper Class를 새롭게 구현
- 아래처럼 generic parameter를 사용해서 Class를 정의( 각각 입력 키 유형을 뜻함)
Class Mapper<KEYIN,VALUEIN,KEYOUT,VALUEOUT> 입력키유형, 입력값유형, 출력키유형, 출력값유형
- Mapcontext를 상속받은 Mapper.context 객체를 선언하고 있음- context객체를 통해 job에 대한 정보를 얻어오고, 입력 스플릿을 Record 단위로 읽음
- context 객체 생성자에 RecordReader를 선언하고 있음. 이부분을 통해 입력스플릿이 키와 값에 Record로 Map 메서드에 parameter로 전달되는 것임.
- Method는 4개로 구성
cleanup, map, run, setup
- map 메서드 선언부
protected void map(KEYIN key, VALUEIN value, Mapper.Context context) throws IOException, InterruptedException맵리듀스 프로그래밍 개발시, 대부분 이 메서드를 재정의하게 됨.
- run 메서드 선언부
protected void cleanup(Mapper.Context context)
throws IOException, InterruptedException
- Called once at the end of the task.
contect 객체에 있는 키를 순회하면서 Map 메서드 호출
Partitioner
- Maptask의 출력데이터가 어떤 reducetask로 전달될지 결정
- MapReduce 기본 Partitioner로 Hashpartitioner 지정되어있음
- 추상화 Classpartitioner를 상속받아 getPartition메서드 재정의하여 partition 번호를 받고 있음.
public int getPartition(K key, V value, int numReduceTasks) |
- 이렇게 계산된 결과대로 Maptask가 실행된 node에 partition이 생성되고 Maptask에 출력 데이터가 저장됨.
- 모든 Maptask의 작업이 완료되면 partition에 저장된 데이터는 해당 reducetask로 네트워크로 전송
Reducer
- Maptask의 출력 데이터를 입력 데이터로 전달받아서 쉽게 연산 수행
- 다음과 같이 generic타입에 parameter를 정의
Class Reducer<KEYIN,VALUEIN,KEYOUT,VALUEOUT>
- Mapper 클래스처럼 내부적으로 context 객체 선언. reduce context 상속 받음Reducer.Context - Reducer.Contect 상세
public Reducer.Context(Configuration conf,
TaskAttemptID taskid, RawKeyValueIterator input, Counter inputKeyCounter, Counter inputValueCounter, RecordWriter<KEYOUT,VALUEOUT> output, OutputCommitter committer, StatusReporter reporter, RawComparator<KEYIN> comparator, Class<KEYIN> keyClass, Class<VALUEIN> valueClass) throws IOException, InterruptedExceptionjob의 정보를 조회하고 입력값 목록을 확인할 수 있도록 RawKeyValueIterator 형태로 전달받음
Map메서드의 출력결과도 Record단위로 만들수 있도록 RecordWriter를 파라미터로 전달받음
- reduce 메소드
protected void reduce(KEYIN key,
Iterable<VALUEIN> values, Reducer.Context context) throws IOException, InterruptedExceptionMapper Class의 map 메서드 재정의 처럼 Reducer Class 구현시 이 메소드 재정의.
Combiner
- Maptask의 출력 데이터는 네트워크를 통해 Reducetask로 전달됨.
- 이러한 전달과정을 shuffle이라고 표현함.
- 네트워크로 전송되어야할 데이터 크기를 줄일수록 전체 job의 성능이 좋아짐
- Combiner Class는 shuffle 할 데이터의 크기를 줄이는 역할을 함.
- Combiner는 Mapper의 출력데이터를 입력데이터로 전달받아 연산을 수행하는데 local node의 출력 데이터를 생성한 후 reducetask의 네트워크로 전달
- 이 때, 출력 데이터는 기존 Mapper의 출력데이터보다 크기가 줄기 때문에 네트워크 비용도 줄어들고, reducer가 처리해야 될 데이터의 양도 줄어들어서 job의 성능이 좋아짐.
OutputFormat
- job interface의 메서드 중, setOutputFormatClass 메서드로 설정한 포맷대로 MapReduce job의 출력 데이터 포맷이 만들어지게 됨.
- 이부분에 OutputFormat이 있음.
- 이 때 사용하는 출력 Dataformat은 OutputFormat Class를 상속받아 구현된 것.
org.apache.hadoop.mapreduce.lib.output 패키지 조회
TextOutputFormat : 기본포맷
- textFile의 Record를 출력할 때 사용
- Record를 출력 할 때 키와 값의 구분자는 tab 사용
SequenceFileOutputFormat
- sequenceFile을 출력물로 쓸 때 사용
SequenceFileAsBinaryOutputFormat
- BinaryFormat의 키와 값을 sequenceFile container에 쓰도록 함.
FilterOutputFormat
- OutputFormat class의 Mapper Class
- 편리한 여러 메서드 제공
void | checkOutputSpecs(JobContext context)Check for validity of the output-specification for the job. |
OutputCommitter | getOutputCommitter(TaskAttemptContext context)Get the output committer for this output format. |
RecordWriter<K,V> | getRecordWriter(TaskAttemptContext context)Get the RecordWriter for the given task. |
LazyOutputFormat
- FileOutputFormat을 상속받은 Class들은 출력할 내용이 없더라도 reduce에 출력파일을 생성
- 출력 파일은 part-nnnnn로 이루어짐
- LazyOutputFormat은 첫번째 Record가 해당 partition으로 보내질 때만 출력 파일을 생성하게 함.
NullOutputFormat
- 출력 데이터가 없을 때 사용








댓글
댓글 쓰기