MapReduce 알고리즘은 2004년 구글에서 발표한 분산형 데이터 처리 알고리즘이다. Hadoop의 MapReduce는 이 논문을 Java로 구현한 애플리케이션이다.
Map과 Reduce는 함수형 프로그래밍에서 사용되는 함수로, map 함수는 Collection의 모든 원소에 적용하여 변환하는 함수를 뜻하고, reduce 함수는 Collection의 원소에 적용되는 집계함수를 뜻한다.
Hadoop의 MapReduce의 주요 용어는 다음과 같다.
•
Job이란, 클라이언트가 수행하는 작업의 단위이다. 입력 데이터, MapReduce 프로그램, 설정정보로 구성된다. 하나의 Job은 Map task, Reduce task로 구성된다. 각 task는 YARN을 통해 스케쥴링되고 실행된다.
•
InputSplit이란, 입력의 논리적인 단위이다. 하나의 Map task는 하나의 InputSplit을 처리한다. InputSplit은 읽어들이는 데이터의 길이와 데이터 Block이 저장되어있는 주소 정보를 가지고있다. 하지만 논리적인 Block의 크기와 실제 입력의 단위의 불일치로 인해, InputSplit은 실제 데이터를 담고있지 않다.
MapReduce 처리과정
전반적인 MapReduce의 처리 과정은 다음과 같다. 각 작업의 특성마다 과정이 생략될 수 있다.
1.
Input file: HDFS 상에 존재하는 파일
2.
InputFormat: 파일을 특정 포맷으로 입력받는다.
InputSplit과 RecordReader를 정의하는 클래스이며, 다음과 같은 대표적인 구현체들이 있다.
•
FileInputFormat - 파일로부터 데이터를 읽어오는 InputFormat이다.
◦
TextInputFormat - 입력파일의 각 line을 record로 처리한다. key는 데이터가 시작하는 byte-offset, value는 실제 데이터이다.
◦
CombineFileInputFormat - 크기가 작은 여러 파일을 하나로 묶어 처리한다.
◦
KeyValueTextInputFormat - 입력파일의 각 line을 record로 처리한다. 특정 구분자로 key와 value를 구분한다.
◦
SequenceFileInputFormat - Sequence file은 Hadoop에서 구현한 파일 포맷으로, 일발 파일보다 처리 속도가 빠르다는 장점이 있다.
•
DBInputFormat - DB로부터 데이터를 읽어오는 InputFormat이다.
•
…
3.
InputSplit: 해당 입력파일을 특정 단위로 분할하는 방식을 정의한다.
데이터의 길이와 블록의 위치를 정의하는 클래스이다.
4.
RecordReader: 파일로부터 데이터를 읽고 key-value형태로 반환한다.
5.
Mapper: 사용자가 정의한 작업을 수행한다.
6.
Combiner: 각 Map 작업의 결과를 기준으로 Reducer에게 전달하기 전에 미리 처리하여 Shuffle 연산을 줄인다. 이 때문에 Local Reducer로도 불린다.
7.
Partitioner: 같은 key를 가지는 데이터를 물리적으로 동일한 reducer로 전달하도록 partitioning한다.
8.
Shuffling and Sorting: Shuffling은 Map의 결과를 Reducer로 전달하는 과정이며, 네트워크 트래픽이 발생한다. Sorting은 전달받은 데이터의 key를 기준으로 정렬하는 과정이다.
9.
Reducer: Shuffling과 Sorting을 통해 전달받은 데이터를 집계한다.
10.
OutputFormat: 처리된 데이터를 특정 포맷으로 출력한다.
11.
Output file: HDFS 상에 저장되는 출력 파일