Phase 7레슨 31
MapReduce
Map, Reduce, Shuffle — 대규모 데이터를 수천 대에서 병렬 처리
💡ELI5·
도서관 목록 작업과 MapReduce
Input: 1000권의 책 ↓ Map (각 사서가 200권씩 담당): 사서1: "hello world hello" → (hello,1)(world,1)(hello,1) 사서2: "hello hadoop" → (hello,1)(hadoop,1) ... ↓ Shuffle (단어별로 모음) hello: [1,1,1] world: [1] hadoop: [1] ↓ Reduce (각 단어 담당자가 합산): hello: 3 world: 1 hadoop: 1
💡 비유 — 1000권의 책에서 단어 빈도를 세야 한다. 한 사람이 다 세면 너무 오래 걸리니, 5명의 사서(Map)가 200권씩 나눠서 세고, 단어별로 모은 다음(Shuffle), 각 단어 담당자(Reduce)가 합산. MapReduce는 이 '나누고 합치기'를 수천 대 컴퓨터로 자동화.
🔬Deep Dive·
MapReduce 실행 흐름
Input Split → Map (병렬) → Shuffle (네트워크) → Reduce (병렬) → Output [Input] [Map] [Shuffle] [Reduce] [Output] file-1 ──→ Mapper-1 ──┐ file-2 ──→ Mapper-2 ──┼── key별 그룹 ──→ Reducer-1 ──→ out-1 file-3 ──→ Mapper-3 ──┘ ─→ Reducer-2 ──→ out-2 Master: 작업 할당, 진행 추적, 장애 시 재실행
| 단계 | 역할 | 병목 |
|---|---|---|
| Map | 입력 데이터를 (key, value) 쌍으로 변환 | CPU |
| Shuffle | Map 출력을 key별로 Reduce 노드로 전송 | 네트워크 (최대 병목) |
| Reduce | 같은 key의 value들을 집계 | CPU + 디스크 |
| Master | 전체 조율, 장애 감지, 재실행 | SPOF |
💻Code·
Word Count 예시
# Map: 각 줄에서 단어를 추출하여 (word, 1) 쌍 생성
def map(line):
for word in line.split():
yield (word, 1)
# Reduce: 같은 단어의 카운트를 합산
def reduce(word, counts):
yield (word, sum(counts))
# 실행:
# Input: "hello world hello hadoop"
# Map: (hello,1) (world,1) (hello,1) (hadoop,1)
# Shuffle: hello→[1,1] world→[1] hadoop→[1]
# Reduce: (hello,2) (world,1) (hadoop,1)🔬Deep Dive·
MapReduce → Spark → Flink 진화
| 시스템 | 중간 데이터 | 실행 모델 | 적합 |
|---|---|---|---|
| MapReduce | 디스크 (매 단계) | 배치 | 대용량 배치 (레거시) |
| Spark | 메모리 (RDD) | 배치 + 마이크로 배치 | 반복 작업, 머신러닝 |
| Flink | 스트림 (연속) | 실시간 스트림 + 배치 | 실시간 처리, 이벤트 기반 |
MapReduce는 분산 데이터 처리의 '원조'지만, 현재는 Spark가 사실상 표준. MapReduce의 핵심 개념(분산, 장애 복구, 데이터 지역성)은 모든 후속 시스템의 기반.
⚖️Trade-off·
MapReduce의 Trade-off
| 이점 | 한계 |
|---|---|
| 수천 대에서 페타바이트 처리 | 매 단계 디스크 I/O (느림) |
| 자동 장애 복구 (태스크 재실행) | Shuffle 네트워크 병목 |
| 개발자는 Map/Reduce만 작성 | 실시간 처리 불가 |
| 데이터 지역성 (계산을 데이터로) | 반복 작업에 비효율 (Spark가 해결) |
❓ 체크포인트 질문
- 1.MapReduce가 해결한 핵심 문제는?
- 2.Shuffle 단계가 병목인 이유는?
- 3.MapReduce Master가 장애 나면 어떻게 되는가?
- 4.Spark가 MapReduce보다 빠른 핵심 이유는?
- 5.MapReduce가 실시간 처리에 부적합한 이유는?