← 목록으로
단계 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단계에서 레이크하우스로 이어집니다.

연습 과제

  1. 100MB 이상 CSV를 Parquet으로 변환해 크기·읽기 시간 비교
  2. 같은 파일을 year=2026/month=08/ 처럼 파티션 디렉터리로 나눠 저장해보기
  3. (선택) Docker로 Hadoop 단일 노드 띄우고 hdfs dfs -put 실행