티스토리 뷰
HDFS
HDFS는 Hadoop Distributed File System의범용 하드웨어로 구성된 클러스터에서 실행되고 스트리밍 방식의 데이터 접근 패턴으로 대용량 파일을 다룰 수 있도록 설계된 분산 파일시스템이다.
- 범용 하드웨어 : 노드 장애 발생 확률이 높은 범용 하드웨어에서 문제없이 실행되며 장애 발생을 사용자가 알 수 없도록 작업을 수행함
- 스트리밍 방식의 데이터 접근 : 데이터를 한 번 쓰고 여러 번 읽음, 첫 번째 레코드를 읽는 시간보다 전체 데이터셋을 읽는 시간이 더 중요함
- 대용량 파일 : 수백 MB, GB, TB를 넘어 PB 크기의 데이터를 저장
- 분산 파일시스템 : 네트워크로 연결된 여러 머신의 스토리지를 관리
블록
블록 크기는 한 번에 읽고 쓸 수 있는 데이터의 최대량이다. 보통 블록의 크기는 다음과 같다.
- 파일시스템 → n KB
- 디스크 → 512 bytes
- HDFS → 128 MB 💡 탐색 비용을 최소화하기 위해 블록의 크기가 큼
파일 크기가 블록 크기보다 작은 경우
- 단일 디스크를 위한 파일시스템 → 하나의 블록 전체를 점유
- HDFS → 파일 크기 만큼만 점유
블록 추상화의 이점
- 파일 하나의 크기가 단일 디스크의 용량보다 커질 수 있다. 파일을 하나의 디스크에만 저장할 필요가 없기 때문이다.
- 스토리지의 서브시스템을 단순화할 수 있다. 블록이 고정 크기이므로 저장하기 위한 디스크 용량만 계산하면 되기 때문에 스토리지 관리가 단순해진다. 그리고 파일의 메타데이터와 데이터를 함께 저장하지 않아도 된다.
블록 수준에서 파일시스템의 유지 관리를 위한 도구
- df : 디스크 여유 공간 확인
- fsck : 파일시스템 일관성 확인 및 대화형 복구 수행
네임 노드와 데이터 노드
HDFS는 하나의 네임 노드와 여러 개의 데이터 노드로 구성되며 이는 Master-Worker 패턴으로 동작한다.
클라이언트 (Client)
- 사용자를 대신해 네임 노드와 데이터 노드 사이에서 통신하고 파일시스템에 접근함
- POSIX와 유사한 파일시스템 인터페이스 제공함
네임 노드 (Name Node)
- 파일시스템의 메타데이터 유지 : Namespace Image와 Edit Log라는 두 종류의 파일로 로컬 디스크에 영속적으로 저장함
- 파일의 블록이 저장된 데이터 노드 파악 : 시스템 시작 시 데이터 노드로부터 정보를 받음 (영속적으로 저장 X)
데이터 노드 (Data Node)
- 실제 데이터를 저장 및 탐색
- 저장하고 있는 블록의 목록을 주기적으로 네임 노드에게 알림
보조 네임 노드 (Secondary Name Node)
- 네임 노드에 장애가 발생하면 파일시스템이 동작하지 않기 때문에 장애 대비용으로 존재함
- Edit Log 가 너무 커지지 않도록 주기적으로 Namespace Image와 Edit Log를 병합하여 최신 버전의 Namespace Image를 생성함
- 장애 발생에 대비해 Namespace Image의 복제본을 보관함 (시간차 복제로 인한 손실은 불가피함)
블록 캐싱
자주 접근되는 블록은 Off-Heap 블록 캐시라는 데이터 노드의 메모리에 명시적으로 캐싱할 수 있다.
- 잡 스케줄러 : 블록이 캐싱된 데이터 노드에서 태스크를 실행할 수 있음
- 사용자나 애플리케이션 : 캐시 풀(Cache Pool)에 캐시 지시자(Cache Directive)를 추가하여 특정 파일을 캐싱할 수 있음
페더레이션
HDFS 페더레이션(Federation)을 활용하면 각 네임 노드가 파일시스템의 네임스페이스를 나누어 관리하는 방식으로 새로운 네임 노드를 추가할 수 있다. 즉, 페더레이션은 네임 노드의 확장성 문제를 해결하기 위한 방안이다.
페더레이션을 적용하면 각 네임 노드는 네임스페이스 볼륨(Namespace Volume)과 블록 풀(Block Pool)을 관리한다.
- 네임스페이스 볼륨(Namespace Volume) : 네임스페이스의 메타데이터를 구성함 (네임 노드마다 독립 O)
- 블록 풀(Block Pool) : 네임스페이스에 포함된 파일의 전체 블록을 보관함 (네임 노드마다 독립 X)
클라이언트는 페더레이션 클러스터에 접근하기 위해 파일 경로와 네임 노드를 매핑한 클라이언트 측 마운트 테이블을 이용한다. 이는 환경 설정에서 ViewFileSystem과 viewfs://URI를 사용해서 관리할 수 있다.
고가용성
데이터 손실을 방지하기 위해 네임 노드의 메타데이터를 다수의 파일시스템에 복제하는 방식과 보조 네임 노드를 사용하여 체크포인트를 생성하는 방식을 조합하여 사용할 수 있다. 하지만 여전히 네임 노드는 단일 고장 지점(Single Point Of Failure, SPOF)이다.
네임 노드에 장애가 발생하면 새로운 네임 노드를 구동하고 요청을 처리하기 위한 준비를 마칠 때까지 아무런 처리도 하지 못한다. 대형 클러스터에서는 30분 이상 소요되기도 한다.
이 문제를 해결하기 위해 HDFS 고가용성(High Availability, HA)은 Active-Standby 상태의 네임 노드 쌍으로 구현된다. Active 네임 노드에 장애가 발생하면 Standby 네임 노드가 그 역할을 이어받아 큰 중단 없이 요청을 처리할 수 있다. (1분 정도 소요)
고가용성을 지원하기 위해 HDFS의 구조가 약간 변경된다.
- Edit Log를 공유하기 위해 고가용성 공유 스토리지를 사용함 (NFS or QJM)
- 데이터 노드는 블록 정보를 두 개의 네임 노드에게 보고함 (네임 노드의 메모리에 저장됨)
- Standby 네임 노드는 Secondary 네임 노드의 역할을 포함함
장애 복구와 펜싱
장애 복구 컨트롤러는 Standby 네임 노드를 활성화시키는 전환 작업을 관리하며, 단 하나의 네임 노드만 Active 상태에 있는 것을 보장하기 위해 주키퍼로 구현된다.
- 우아한 장애 복구(Graceful Failover) : 정기적인 유지 관리를 위해 관리자가 수동으로 초기화함
- 우아하지 않은 장애 복구(Ungraceful Failover) : 장애가 발생한 네임 노드가 중단됐다는 것을 확신하기 어려움
고가용성을 위해 기존의 Active 네임 노드가 시스템을 손상시키지 않도록 하기 위해 펜싱(fencing) 메소드가 제공된다. 공유 스토리지 접근 제한, 원력으로 네트워크 포트 차단 등 다양한 펜싱 메커니즘이 있다.
'Big Data > Hadoop' 카테고리의 다른 글
[하둡 완벽 가이드] Chapter 03. 하둡 분산 파일시스템(2) (0) | 2022.09.09 |
---|---|
하둡 실행하기 (의사 분산 모드) (0) | 2022.09.09 |
하둡 설치하기 (0) | 2022.08.26 |
[하둡 완벽 가이드] Chapter 02. 맵리듀스 (0) | 2022.08.25 |
[하둡 완벽 가이드] Chapter 01. 하둡과의 만남 (0) | 2022.08.24 |