← 목록으로
단계 05
분산 저장 — HDFS, 클라우드, 파일 포맷
왜 분산 저장인가, HDFS 구조(NameNode/DataNode/블록/복제), 오브젝트 스토리지, CSV·JSON·Parquet 비교, 데이터 레이크.
왜 분산 저장인가
- 디스크 한 개: 수 TB, 읽기 속도 ~200MB/s → 10TB 읽는 데 14시간
- 100대에 나눠 담으면 병렬로 읽어 몇 분
- 디스크는 반드시 고장난다 → 여러 대에 복제해두면 살아남음
즉, 분산 저장의 두 목적은 용량/속도(scale-out) 와 내결함성(fault tolerance).
HDFS 구조
┌──────────────┐
client ──▶│ NameNode │ 메타데이터: 어떤 파일이 어떤 블록으로, 어느 노드에
└──────┬───────┘
┌─────────────┼─────────────┐
┌────▼────┐ ┌────▼────┐ ┌────▼────┐
│DataNode1│ │DataNode2│ │DataNode3│ 실제 블록 저장 (기본 128MB, 3중 복제)
│ B1 B2 │ │ B1 B3 │ │ B2 B3 │
└─────────┘ └─────────┘ └─────────┘
- NameNode: 파일 → 블록 → 위치 맵. 단일 장애점이라 HA 구성 필요
- DataNode: 블록을 저장하고 주기적으로 heartbeat 전송
- 블록(128MB): 큰 파일을 잘라 여러 노드에 분산 → 병렬 처리의 단위
- 복제(3): 한 노드가 죽어도 데이터 손실 없음
- Write once, read many: 수정보다 추가(append)에 최적화
hdfs dfs -ls /data
hdfs dfs -put local.csv /data/
hdfs dfs -cat /data/local.csv | head
오브젝트 스토리지 (S3, GCS, Azure Blob)
- 파일 시스템이 아니라 키(key) → 객체(object) 저장소.
s3://bucket/path/file.parquet - 사실상 무제한 용량, 저장과 컴퓨트 분리 → 현대 데이터 레이크의 표준
- HDFS와 달리 디렉터리 이름 바꾸기가 비싸고, 목록 조회가 느림 → 파티션 설계가 중요
- 13주차에
spark.read.parquet("s3a://...")실습
파일 포맷 비교
| 포맷 | 구조 | 장점 | 단점 |
|---|---|---|---|
| CSV | 행, 텍스트 | 어디서나 열림 | 스키마 없음, 크고 느림 |
| JSON | 행, 중첩 가능 | 유연한 구조 | 크고 느림 |
| Parquet | 열 지향, 바이너리 | 압축률 높음, 필요한 열만 읽음, 스키마 내장 | 사람이 직접 못 읽음 |
| Avro | 행, 바이너리 | 스키마 진화, 스트리밍에 적합 | 분석 쿼리엔 느림 |
import pandas as pd
df = pd.read_csv("big.csv")
df.to_parquet("big.parquet") # 보통 크기 1/5 ~ 1/10
pd.read_parquet("big.parquet", columns=["region", "amount"]) # 필요한 열만
데이터 레이크
원본(raw) 데이터를 가공하지 않고 저렴한 스토리지(S3/HDFS)에 그대로 쌓고, 필요할 때 Spark 등으로 읽어 쓰는 방식.
s3://lake/
raw/ 원본 그대로 (JSON, CSV) ← 수집
cleaned/ 정제·형변환·Parquet ← 처리
curated/ 분석용 집계 테이블 ← 분석
이 raw → cleaned → curated (또는 bronze/silver/gold) 계층이 실무 표준입니다. 11단계에서 레이크하우스로 이어집니다.
연습 과제
- 100MB 이상 CSV를 Parquet으로 변환해 크기·읽기 시간 비교
- 같은 파일을
year=2026/month=08/처럼 파티션 디렉터리로 나눠 저장해보기 - (선택) Docker로 Hadoop 단일 노드 띄우고
hdfs dfs -put실행