HDFS 아키텍처와 대용량 데이터 운영 전략
HDFS의 NameNode·DataNode 구조, 복제와 장애 복구, 읽기·쓰기 경로 및 운영 설계 원칙을 정리한다.
2026-08-14 · 최초 발행 2025-10-14
HDFS가 맡는 저장 계층
HDFS(Hadoop Distributed File System)는 대용량 파일을 블록으로 나누고 여러 DataNode에 복제해 분산 저장하는 파일시스템이다. Hadoop 생태계에서는 MapReduce 같은 분산 처리 프레임워크가 데이터를 영속적으로 다루는 기반 계층으로 동작한다.
설계의 중심은 임의 접근보다 고대역폭 순차 I/O다. 저비용 서버와 디스크를 수평으로 늘려 페타바이트급 데이터를 저장·처리하며, 장애가 발생해도 복제본과 재복제 절차로 가용성을 유지한다. 쓰기 일관성 모델은 Write-once, read-many에 맞춰져 있고 Append는 제한적으로 지원한다.
메타데이터와 블록 저장을 분리하는 구조
NameNode는 파일·디렉터리 네임스페이스, 권한, 블록 매핑 같은 메타데이터를 관리한다. FsImage와 Edits 로그를 이용해 저널링하며, HA 구성에서는 JournalNode와 연동한다.
DataNode는 실제 데이터 블록을 저장하고 복제·검증한다. 주기적으로 Heartbeat와 BlockReport를 보내 상태를 알리며, 쓰기 경로에서는 파이프라인 전송으로 블록 복제를 수행한다.
Hadoop Common은 공통 라이브러리, 유틸리티, RPC, 직렬화, 구성 관리를 제공하는 기반 계층이다. MapReduce는 대용량 데이터셋을 처리하는 프로그래밍 모델과 프레임워크로, 데이터 지역성을 활용해 네트워크 비용을 줄이는 배치 처리 중심 구조다.
복제와 데이터 지역성이 만드는 처리 특성
HDFS는 기본 복제계수(replication factor)를 3으로 구성한다. 노드·디스크·랙 장애가 나면 자동 재복제로 데이터 가용성을 확보한다. 체크섬 검증, Heartbeat, BlockReport를 통한 상태 모니터링과 자가치유도 이 구조에 포함된다.
큰 블록 크기(128MB+)와 파이프라인 스트리밍, 데이터 지역성(Data Locality)은 대규모 스캔과 배치 ETL에 맞는 처리량을 만든다. 동일한 역할의 노드를 추가하면 저장 용량과 처리 대역폭을 선형으로 확장할 수 있으며, Commodity 서버·디스크를 전제로 노드 교체와 증설을 단순화한다.
Rack Awareness는 네트워크 토폴로지를 고려해 블록을 배치한다. Balancer/Rebalancer, FSCK, Safemode, Rolling Upgrade 같은 도구는 이 분산 환경을 운영하는 데 사용된다.
쓰기 요청은 파이프라인으로 복제된다
클라이언트가 create를 호출하면 NameNode가 블록을 할당하고 DataNode 파이프라인을 반환한다. 클라이언트는 첫 DataNode로 블록 청크를 스트리밍하고, 각 DataNode는 다음 노드로 전달한다. ack는 반대 방향으로 돌아오며, 모든 DataNode의 ack를 받은 청크가 커밋된다. close 시점에는 메타데이터가 최종 커밋된다.
파이프라인 안의 노드가 실패하면 경로를 다시 구성해 실패 노드를 우회한다. Under-replicated 블록은 비동기로 재복제하며, 지속적으로 실패하는 노드는 블랙리스트 처리한다. 각 청크에는 체크섬 검증이 적용된다.
읽기, 저널링, SafeMode의 운영 의미
읽기에서는 클라이언트가 open 요청을 보내고, NameNode가 블록 위치 목록을 돌려준다. 클라이언트는 랙·노드 지역성을 기준으로 가장 가까운 DataNode에서 병렬로 읽은 뒤 블록을 재조합해 스트림으로 제공한다. 체크섬 검증에 실패하면 다른 복제본을 재시도한다.
NameNode의 메타데이터 트랜잭션은 Edits 로그를 먼저 기록하고, 주기적으로 FsImage 스냅샷 형태의 Checkpoint를 수행한다. HA에서는 Active/Standby NameNode와 JournalNode 과반수 합의로 로그를 커밋하고, 장애 때 자동 Failover를 구성한다. 클러스터가 재시작된 직후에는 블록 가용성 임계치를 충족할 때까지 SafeMode로 쓰기를 금지한다.
| 관점 | HDFS 특성 | 운영 시 확인할 점 |
|---|---|---|
| 성능(Throughput) | 대용량 순차 I/O와 대역폭 집계에 최적화 | 블록 크기 128~256MB, 맵태스크 수 과도 증가 방지 |
| 확장성 | 노드 증설에 따른 선형 확장 | 랙 인식 설정, 균형화 작업 정기 수행 |
| 일관성 | Write-once, Append 제한 | 동시 쓰기 회피, 스트리밍 처리 패턴 설계 |
| 안정성 | 복제·자가치유·체크섬 | 복제계수 2↔3 트레이드오프, 장애 도메인 분산 |
| 운영 편의 | Balancer/FSCK/Snapshot | 유지보수 윈도우와 롤링 업그레이드 계획 수립 |
데이터 레이크부터 아카이브까지
HDFS는 원천 로그, 이벤트, 반정형 파일을 장기 보관하는 데이터 레이크 원천 영역에 사용할 수 있다. MapReduce나 Spark와 결합한 배치 ETL/ELT, 대규모 이미지·텍스트 코퍼스를 순차 스캔하는 머신러닝 학습 데이터 저장도 대상이다.
스냅샷을 활용한 시점 복구와 장기 보관 비용 효율성이 필요한 백업·아카이브, 실험적인 처리와 재현 가능한 결과 관리가 필요한 분석 샌드박스에도 적용할 수 있다.
복제계수·블록 크기·HA를 함께 결정한다
복제계수는 기본 3을 권장하며, 동적 워크로드나 핫 데이터에는 4 이상을 고려한다. 저장 효율은 용량 1/RF와 연결되고, 가용성·읽기 병렬성과의 트레이드오프가 생긴다.
블록 크기는 128~256MB를 권장하고 초대형 파일에는 512MB를 고려한다. 작은 파일이 많아지면 NameNode 메모리에 압박이 생길 수 있으므로 HAR, SequenceFile, Parquet으로 통합하는 방식을 검토한다.
복제본을 서로 다른 랙에 배치하면 랙 장애 위험을 줄일 수 있지만, 이를 위해서는 네트워크 토폴로지 정의가 정확해야 한다. 고가용성은 Active/Standby NameNode와 3 JournalNode 구성으로 설계하고, 자동 페일오버에서는 ZKFC/쿼럼을 통해 Split-brain을 막아야 한다.
Kerberos 기반 인증과 HDFS 권한/ACL, 전송 암호화(HTTPS/SASL)를 적용한다. 멀티테넌시 환경에서는 쿼터, 스냅샷, 감사 로그를 활성화한다. 노드를 증설한 뒤에는 Balancer를 실행해 스토리지 풀의 균형을 맞추고, Lifecycle 정책으로 핫·콜드 계층을 분리하며 장기 보관 데이터는 압축과 저비용 스토리지 연계를 고려한다.
단일 노드 환경에서 확인할 기본 명령
# HDFS 기동
$ start-dfs.sh
# 디렉토리/권한
$ hdfs dfs -mkdir -p /data/logs
$ hdfs dfs -chmod 755 /data
# 파일 업로드/검증
$ hdfs dfs -put app.log /data/logs/
$ hdfs dfs -ls /data/logs
$ hdfs dfs -cat /data/logs/app.log | head
# 복제계수 조정(예: 2)
$ hdfs dfs -setrep -w 2 /data/logs/app.log
$ hdfs dfs -stat %r /data/logs/app.log
# 무결성 검사/상태
$ hdfs fsck / -files -blocks -locations | head
저비용 서버와 디스크를 기반으로 PB급 저장 비용을 줄일 수 있으며, 동일 용량 대비 전통 SAN 대비 TCO를 40~70% 절감할 수 있다(환경 의존). 노드 10대 기준 집계 대역폭은 수 GB/s 수준에 도달할 수 있고, 노드를 추가하면 선형으로 증가한다.
노드 장애가 발생하면 Under-replicated 블록은 수분 내 자동 복구되어 서비스 지속성을 뒷받침한다. 무중단 증설과 롤링 업그레이드가 가능하며, 스냅샷과 쿼터는 안전한 멀티테넌시 운영에 활용된다. HDFS는 데이터 레이크의 기반 계층으로서 배치 처리, 머신러닝, 아카이브 워크로드에 맞는다.