← 목록으로
단계 06
MapReduce · Hadoop · YARN
map/shuffle/reduce의 동작 원리, Hadoop 생태계, YARN의 자원 관리 개념, Python으로 흉내 내는 워드카운트.
핵심 아이디어
데이터가 100대에 나뉘어 있으면, 데이터를 옮기지 말고 코드를 데이터가 있는 곳으로 보내자.
각 노드가 자기 블록만 처리(map)하고, 같은 키끼리 모아서(shuffle), 합친다(reduce).
워드카운트로 보는 3단계
입력: "big data" "data lake" "big lake"
node1 node2 node3
Map: (big,1) (data,1) (big,1)
(data,1) (lake,1) (lake,1)
Shuffle (같은 키끼리 한 곳으로):
big → [1,1]
data → [1,1]
lake → [1,1]
Reduce: (big,2) (data,2) (lake,2)
Python으로 흉내 내기
from collections import defaultdict
lines = ["big data", "data lake", "big lake"]
# map
mapped = []
for line in lines:
for word in line.split():
mapped.append((word, 1))
# shuffle (group by key)
grouped = defaultdict(list)
for k, v in mapped:
grouped[k].append(v)
# reduce
result = {k: sum(vs) for k, vs in grouped.items()}
print(result) # {'big': 2, 'data': 2, 'lake': 2}
실제 Hadoop은 이 세 단계를 수백 대에서 병렬로, 그리고 중간 결과를 디스크에 쓰면서 수행합니다. 이 "디스크에 쓴다"가 느린 이유이고, Spark가 등장한 배경입니다.
Hadoop 생태계
| 구성 | 역할 |
|---|---|
| HDFS | 저장 |
| YARN | 자원 관리·스케줄링 (CPU/메모리 배분) |
| MapReduce | 처리 엔진 (원조) |
| Hive | SQL → MapReduce/Tez 변환 |
| HBase | HDFS 위의 NoSQL |
| Spark | MapReduce를 대체한 처리 엔진 (YARN 위에서도 실행) |
YARN 개념
ResourceManager (클러스터 전체 자원 관리)
│ "이 잡에 컨테이너 10개 줘"
▼
NodeManager × N (각 노드의 컨테이너 실행)
│
ApplicationMaster (잡 하나의 진행 관리)
- 여러 종류의 잡(MapReduce, Spark 등)이 한 클러스터를 공유할 수 있게 함
- Spark를
--master yarn으로 실행하면 YARN이 executor 컨테이너를 배분
연습 과제
- 위 Python 워드카운트를 함수
map_fn,reduce_fn으로 분리하고 다른 집계(지역별 매출 합계)에 재사용 - (선택)
mrjob으로 로컬에서 MapReduce 워드카운트 실행