하둡은 데이터를 맵핑하여 원하는 형태로 만들고 맵핑된 데이터를 정렬하여 원하는 결과로 reduce 시킵니다.
앞서서는 하둡에서 사용하는 file system인 HDFS를 설명했다면, 실제로 하둡 프로그래밍을 하기 위해서 필요한 맵리듀스에 대해서 얘기합니다.
이글은 "시작하세요! 하둡 프로그래밍"을 참고하였습니다.대부분의 내용이 생략되고 정리된 내용이므로 자세한 내용은 꼭 책을 구입하여 확인하시기 바랍니다.
맵리듀스의 구성
- 맵과 리듀스를 몇개 실행할지 결정
- 실행을 담당할 TaskTracker를 결정하고 Job을 할당
- TaskTracker를 모니터링 하여 장애를 검출시 다른 TaskTracker에 할당
맵리듀스의 동작
1. InputSplit
HDFS에서 입력데이터를 읽어들입니다.
파일이 하나라도 HDFS에서 설정한 블록 크기 단위로 split을 생성하고 split 당 하나의 mapTask를 생성합니다.
ex) HDFS 블럭 크기가 128MB 이며, 읽어들일 파일이 300MB면 split은 3개 생성됨 (mapTask도 3개 생성됨)
MapTask는 레코드 단위로 데이터를 읽어 사용자가 설정한 Mapper의 map() 함수를 수행합니다.
map() 함수를 거지면 결과는 (key, value) 형태로 저장됩니다.
이때 생성되는 결과는 MapTask가 실행된 서버 내부에 저장되며, job이 완료되면 삭제됩니다.
2. Shuffle and Sorting
MapTask의 결과를 ReduceTask로 전달하기 위해 정렬하는 단계 입니다.
ReduceTask의 개수만큼 파티션을 만들고 파티셔너는 MapTask의 결과를 각 partition으로 보냅니다.
MapTask 결과의 key에서 hash값을 구하고 hash에 따라 어떤 partition으로 이동될지가 결정됩니다.
shuffle 단계가 완료되면 각 파티션에는 동일한 key를 갖는 값들이 모이게 되고, 각 key들로 sorting됩니다.
3. Reduce
key별로 정렬된 결과를 마지막 형태로 가공하여 hdfs에 저장됩니다.
이때 ReduceTask는 정렬된 결과를 레코드 단위로 읽어 사용자가 정의한 reduce 함수에 전달합니다.
reduce함수로 처리된 결과가 마지막으로 hdfs에 part-xxxxx라는 파일로 저장됩니다.
xxxxx는 00000 부터 1씩 증가하며, 파티션 번호를 나타냅니다.
만약 블럭단위가 128MB 인 경우 그 이하 크기인 파일을 하둡으로 돌린다면 part-00000 하나만 생성되겠죠?
데이터 타입
- BooleanWritable
- ByteWritable
- DoubleWritable
- FloatWritable
- IntWritable
- LongWritable
- TextWrapper (UTF8 형태의 문자열)
- NullWritable (데이터 값이 필요 없을때)
InputFormat
- TextInputFormat: \n 기준으로 읽음 key = 라인번호 (LongWritable) | value = 라인내용(Text)
- KeyValueTextInputFormat: 키값을 라이번호가 아닌 다른 값을 지정 할 때 사용
- NLineInputFormat: MapTask가 입력받을 텍스트 파일의 라인수를 제한 할 때 사용
- DelegatingInputFormat: 서로 다른 입력 포멧이 필요할때 각 경로에 작업을 위임 할 때 사용
- CombineFileInputFormat: 여러개의 파일을 묶어서 split 시킬때 사용
- SequenceFileInputFormat: SequenceFile을 입력데이터로 쓸때 사용
- SequenceFileAsBinaryInputFormat: SequenceFile의 키값을 임의의 바이너리 객체로 변환해서 사용
- SequenceFileAsTextInputFormat: SequenceFile의 키값을 Text 객체로 변환해서 사용
OutputFormat
- TextOutputFormat: 텍스트 파일에 레코드를 출력 key, value는 탭으로 구분함
- SequenceFileOutputFormat: SequenceFile을 출력 할 때 사용
- SequenceFileByBinaryOutputFormat: SequenceFile에 key, value를 binary 값으로 씀.
- FilterOutputFormat OutputFormat의 클래스를 편하게 사용할 수 있는 메서드 제공
- LazyOutputFormat: FileOutputFormat를 상속받은 다른 타입들을 출력내용이 없더라도 출력 파일(part-xxxxx)를 생성하나, 레코드가 파티션으로 보내질때만 출력 파일을 생성함
- NullOutputFormat: 출력파일이 없을때 사용
Sequence file
'개발이야기 > Hadoop' 카테고리의 다른 글
[Hadoop] 하둡 - 맵 리듀스(MapReduce)의 수행 단계 (0) | 2019.09.24 |
---|---|
[Hadoop] 하둡 - 맵리듀스의 기초, 기본 예제 #2 (0) | 2019.09.23 |
[Hadoop] 하둡 - HDFS를 코드로 접근하기 #3 (0) | 2019.09.19 |
[Hadoop] 하둡 - HDFS 명령어 #2 (0) | 2019.09.17 |
[Hadoop] 하둡 - HDFS 기초 #1 (0) | 2019.09.16 |