시작하며
분산 파일 시스템은 일반적으로 네트워크로 연결된 여러 머신의 스토리지를 관리하는 파일 시스템을 의미한다.
이 글에서는 HADOOP을 구성하는 주요 컴포넌트 중 하나인 HDFS에 대해 정리한다.
HDFS의 모태는 GFS(Google File System)다. GFS는 Master(masterserver)와 Worker(chunkserver) 구조를 가지고 있으며, HDFS도 이 구조를 계승한다.
HDFS 구조와 동작
HDFS 특징
- 범용 하드웨어를 통한 분산 파일 시스템 구성
- 파일을 블록 단위로 저장
- 마스터-워커 구조
- 데이터를 복제하여 내고장성(fault tolerance) 제공
- 수평 확장성 제공
블록
하나의 파일을 여러 블록으로 나누어 저장한다. Hadoop 2는 기본 128MB, Hadoop 1은 64MB가 기본이며, 실제 파일 크기가 블록 사이즈보다 작은 경우에는 파일 크기만큼만 디스크를 사용한다.
HDFS에서 블록 사이즈가 큰 이유
탐색 비용을 최소화하기 위해서다. 하드디스크에서 블록의 시작점을 탐색하는 시간(Disk SEEK time)을 줄이게 되고, 메타데이터 크기도 감소한다.
블록 단위 처리 이점
- 물리 디스크에 실제 저장할 수 있는 용량보다 더 큰 파일을 저장할 수 있다.
- 스토리지 관리가 단순화된다.
- 내고장성과 가용성을 지원하는 복제 기능을 구현하기에 유리하다.
HDFS 구조
NameNode
파일 시스템의 메타데이터를 가지고 있다(어떤 노드가 어떤 블록 데이터를 가지고 있는지 등).
메타데이터는 두 가지로 구성된다.
- FsImage(파일 시스템 이미지) : 네임스페이스를 포함한 데이터의 모든 정보
- EditLog : 데이터 노드에서 발생한 데이터의 변환 내역
Secondary NameNode
NameNode의 Standby 역할이 아니라, FsImage와 EditLog를 주기적으로 병합(체크포인트)한다.
체크포인트가 필요한 이유는 다음과 같다. NameNode가 시작되면 파일 시스템의 내용을 로드한 후, 변경사항을 저장하기 위한 EditLog의 정보를 반영한 후 HDFS를 사용할 수 있다. FsImage는 생성된 이후 변경되지 않기 때문에 HDFS가 동작하면서 변경되는 내용은 EditLog에만 반영되므로 EditLog가 계속 커진다. 그러면 변경 이력 정보를 메모리에 반영하는 시간이 오래 걸린다. Secondary NameNode는 이를 주기적으로 해소해 준다.
Secondary NameNode 동작방식 (체크포인트 동작 과정)
- EditLog에 먼저 롤링을 요청한다. (롤링: 현재까지의 로그를 새로운 이름으로 저장하고, 새로운 로그는 기존의 이름으로 생성하기 시작한다.)
- Secondary NameNode에서는 FsImage와 EditLog를 다운받는다.
- 이를 머지한다.
- NameNode에 이를 전달하여 반영한다.
DataNode
실제 파일을 로컬 파일 시스템에 HDFS 데이터로 저장한다. NameNode에 하트비트를 전송하여 상태를 확인시켜 준다. 블록의 변경 상태를 리포트하여 주기적으로 NameNode에 알려준다.
HDFS 읽기 연산
- ClientNode에서 NameNode에게 파일이 저장된 블록 정보를 요청한다.
- NameNode는 해당 블록이 어디에 저장되어 있는지 Client에 전달한다.
- ClientNode는 각 DataNode에게서 데이터를 읽어온다.
HDFS 쓰기 연산
- ClientNode에서 NameNode에게 파일 쓰기를 요청한다.
- NameNode에서는 파일을 써야 하는 노드 목록을 리턴해준다.
- ClientNode에서는 데이터를 써야 할 노드들에게 데이터를 전달하고 쓰게 한다.
- 설정된 replication factor를 기준으로 노드 간에 복제가 진행된다.
- 복제가 완료되면 Ack 정보를 받게 된다.
- Client에서 DataNode로부터 모든 복제가 완료되었다는 Ack를 받게 되면 NameNode에게 작업이 완료되었다는 것을 알려준다.
HDFS 추가 기능
- 블록 캐싱 : 데이터 노드에 저장된 데이터 중에서 자주 읽는 블록 혹은 파일을 메모리에 캐싱한다.
- HDFS Federation : NameNode는 파일 정보를 메타데이터(메모리)로 관리하는데, 메타데이터가 계속 쌓이면 메모리가 부족해진다. Hadoop 2부터는 Federation을 통해 namespace 단위로 NameNode를 등록하여 사용할 수 있다.
- 고가용성(HA) : Active-Standby 구조로, Standby 상태인 NameNode는 Active와 마찬가지로 동일한 메타데이터 정보를 유지하고 있다가 Active NameNode를 대체한다. 주키퍼(ZooKeeper)를 통해 지원한다.
정리하며
HDFS는 대용량 파일을 블록 단위로 분산 저장하고, NameNode와 DataNode의 마스터-워커 구조로 운영된다. Secondary NameNode의 체크포인트 메커니즘, 읽기·쓰기 연산의 구체적인 흐름, Federation과 HA 기능까지 이해하면 HDFS 클러스터를 운영하거나 장애를 대응하는 데 실질적인 도움이 된다. 다음 글에서는 YARN에 대해 살펴본다.