← 목록으로
단계 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처리 엔진 (원조)
HiveSQL → MapReduce/Tez 변환
HBaseHDFS 위의 NoSQL
SparkMapReduce를 대체한 처리 엔진 (YARN 위에서도 실행)

YARN 개념

 ResourceManager (클러스터 전체 자원 관리)
      │  "이 잡에 컨테이너 10개 줘"
      ▼
 NodeManager × N (각 노드의 컨테이너 실행)
      │
 ApplicationMaster (잡 하나의 진행 관리)
  • 여러 종류의 잡(MapReduce, Spark 등)이 한 클러스터를 공유할 수 있게 함
  • Spark를 --master yarn으로 실행하면 YARN이 executor 컨테이너를 배분

연습 과제

  1. 위 Python 워드카운트를 함수 map_fn, reduce_fn으로 분리하고 다른 집계(지역별 매출 합계)에 재사용
  2. (선택) mrjob으로 로컬에서 MapReduce 워드카운트 실행