MapReduce는 디스크 기반, Spark는 메모리 기반.
MapReduce
입력 → Map → [디스크 저장] → Shuffle → [디스크 저장] → Reduce → 출력
↑ 매 단계마다 HDFS에 중간 결과 쓰고 읽음
Spark
입력 → Map → Shuffle → Reduce → 출력
↑ 중간 결과를 메모리(RAM)에 유지
(필요할 때만 디스크)
중간 결과를 매번 디스크에 쓰느냐, 메모리에 들고 있느냐의 차이가 속도 100배 차이를 만들어.
| 항목 | MapReduce | Apache Spark |
|---|---|---|
| 처리 위치 | 디스크 (HDFS) | 메모리 (RAM) 우선 |
| 속도 | 느림 | 최대 100x 빠름 |
| 처리 모델 | 배치만 | 배치 + 스트리밍 + ML + 그래프 |
| 프로그래밍 모델 | Map / Reduce 2단계 | DAG (유향 비순환 그래프) |
| 지연 실행 | 없음 | 있음 (Lazy Evaluation) |
| 언어 지원 | Java 중심 | Scala, Python, Java, R |
| 반복 처리 | 매우 비효율 | 효율적 (ML에 적합) |
| 내결함성 | HDFS 복제 | RDD 리니지 재계산 |
| 학습 난이도 | 상대적으로 단순 | 높음 |
| 메모리 요구량 | 낮음 | 높음 |
머신러닝에서 흔한 반복 알고리즘을 예로 들면:
# 경사하강법 - 같은 데이터를 100번 반복 처리한다고 가정
MapReduce:
1회차: 읽기(HDFS) → 처리 → 쓰기(HDFS)
2회차: 읽기(HDFS) → 처리 → 쓰기(HDFS)
...
100회차: 읽기(HDFS) → 처리 → 쓰기(HDFS)
→ 디스크 I/O 200번 발생
Spark:
1회차: 읽기(HDFS) → 메모리에 올림
2~100회차: 메모리에서 바로 처리
→ 디스크 I/O 1번
이게 ML 워크로드에서 Spark가 압도적인 이유야.