맵리듀스: 맵과 리듀스로 나눠 대용량 데이터를 처리하는 법
구글이 2004년 발표한 맵리듀스의 맵-셔플-리듀스 처리 모델과 하둡 구현 구조, 워드 카운트 예제와 활용 사례, 한계를 정리한다.
2026-08-13 · 최초 발행 2025-05-23
맵리듀스(MapReduce)는 구글이 2004년 발표한 대규모 데이터셋 처리 모델이자 기법이다. 대용량 데이터를 분산 환경에서 효율적으로 처리하는 방법을 제시하며 빅데이터 처리의 기반 기술로 꼽힌다.
맵이 흩고 리듀스가 모은다
맵리듀스는 이름 그대로 '맵(Map)'과 '리듀스(Reduce)' 두 단계로 구성된다.
- 맵 단계: 입력 데이터를 키-값 쌍으로 변환하고 필터링·정렬하는 과정
- 리듀스 단계: 맵 단계에서 나온 중간 결과를 집계해 최종 결과를 만드는 과정
단순한 두 단계지만 분산 환경에서 실행될 때 성능을 낸다.
입력 분할에서 결과 저장까지
맵리듀스 프레임워크는 다음 단계로 작업을 처리한다.
- 입력 분할(Input Split): 대용량 입력 데이터를 여러 블록으로 분할
- 맵 함수 실행(Map Phase): 각 블록에 맵 함수를 적용해 중간 키-값 쌍 생성
- 셔플링(Shuffling): 중간 결과를 키 기준으로 정렬·그룹화
- 리듀스 함수 실행(Reduce Phase): 그룹화된 데이터에 리듀스 함수를 적용해 최종 결과 생성
- 결과 저장(Output): 최종 결과를 지정된 저장소에 저장
빅데이터 처리에 이 모델이 맞는 이유
- 분산 처리: 대용량 데이터를 여러 노드에 나눠 병렬로 처리
- 내결함성(Fault Tolerance): 노드 장애가 나면 해당 태스크를 다른 노드에 자동 재할당
- 확장성(Scalability): 컴퓨팅 자원을 추가해 처리 능력을 선형적으로 확장
- 데이터 지역성(Data Locality): 데이터가 있는 곳에서 계산을 수행해 네트워크 부하를 줄임
- 프로그래밍 간소화: 개발자는 복잡한 분산 처리 로직 대신 맵과 리듀스 함수 구현에만 집중
텍스트에서 단어 빈도를 세는 예제
맵리듀스를 설명할 때 가장 자주 쓰이는 예제는 텍스트 파일에서 단어 출현 빈도를 계산하는 워드 카운트다.
맵 단계는 텍스트 라인을 입력받아 (단어, 1) 형태의 키-값 쌍을 출력한다 — "Hello World Hello"는 ("Hello", 1), ("World", 1), ("Hello", 1)로 바뀐다. 셔플링은 같은 키를 가진 값을 묶어 ("Hello", [1, 1]), ("World", [1])처럼 그룹화한다. 리듀스 단계는 이 그룹을 받아 ("Hello", 2), ("World", 1)처럼 단어별 총 출현 빈도를 낸다.
하둡이 구현한 잡트래커와 태스크트래커
맵리듀스 모델은 아파치 하둡(Apache Hadoop)에서 가장 성공적으로 구현됐다. 하둡 맵리듀스는 다음 컴포넌트로 구성된다.
- JobTracker: 전체 맵리듀스 작업을 관리·스케줄링하는 마스터 노드
- TaskTracker: 실제 맵·리듀스 태스크를 실행하는 워커 노드
- HDFS(Hadoop Distributed File System): 데이터 저장을 담당하는 분산 파일 시스템
배치 처리의 한계와 그 이후
맵리듀스는 배치 처리에 최적화돼 있지만 한계도 있다.
- 반복적 알고리즘에 비효율적: 각 작업이 독립적으로 실행되며 중간 결과를 디스크에 저장한다
- 실시간 처리에 부적합: 배치 처리 모델이라 실시간 데이터 처리에 한계가 있다
- 복잡한 워크플로우 구현이 어려움: 단순한 맵-리듀스 패턴 밖의 복잡한 처리 흐름을 표현하기 어렵다
이 한계를 극복하려 여러 기술이 등장했다. Apache Spark는 인메모리 처리로 반복 작업 성능을 개선했고, Apache Flink는 스트리밍 처리에 최적화된 분산 처리 엔진이며, Apache Tez는 복잡한 데이터 처리 파이프라인 구성을 지원한다. 그럼에도 맵리듀스의 기본 원리는 여전히 빅데이터 처리의 근간을 이루고 있다.
로그 분석부터 유전체 분석까지
맵리듀스는 특히 하둡 에코시스템과 함께 여러 산업에서 쓰인다.
- 로그 분석: 대규모 서버 로그 데이터 처리·분석 — 웹 서버 로그에서 사용자 행동 패턴을 추출하는 식이다
- 검색 엔진: 웹 크롤링 데이터 인덱싱 — 구글의 PageRank 알고리즘 구현이 대표적이다
- 머신러닝: 대용량 훈련 데이터 전처리 — 추천 시스템의 사용자-아이템 매트릭스를 만드는 데 쓰인다
- 과학 데이터 분석: 대용량 실험 데이터 처리 — 유전체 시퀀싱 데이터 분석이 그 예다
자바로 짠 워드 카운트
하둡 맵리듀스를 자바로 구현한 워드 카운트 예제다.
public class WordCount {
public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}
public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}