하둡 분산 파일 시스템 HDFS 이해하기

HDFS (Hadoop 분산 파일 시스템)는 Apache Hadoop 에코시스템의 초석으로, 컴퓨터 클러스터 전체에서 방대한 양의 데이터를 저장하고 관리하도록 설계되었습니다.

HDFS의 아키텍처는 안정성, 확장성 및 효율적인 데이터 처리를 보장하므로 빅 데이터 애플리케이션에 널리 사용됩니다.

해당 포스트는 KMOOC 빅데이터 프레임워크 강의 내용을 기반으로 정리한 글 입니다.

강좌: 빅데이터 프레임워크 (kmooc.kr)

HDFS 개념

주요 목표는 대용량 파일(기가바이트에서 테라바이트 범위)을 처리하고 내결함성을 제공하며 데이터 가용성을 보장하는 것입니다.

여러 노드에 데이터를 분산함으로써 HDFS는 원활하게 확장될 수 있으므로 성능 저하 없이 증가하는 데이터 양을 저장하고 처리할 수 있습니다.

HDFS 특징

컴퓨터 네트워크를 사용해 다수의 노드에 걸쳐 많은 양의 데이터를 저장할 수 있습니다.

데이터의 장애 허용을 위해 중복을 허용합니다.

  • 기본적으로 3개의 복사본을 둡니다.
  • 3개의 복사본은 서로 다른 노드에 존재합니다.

데이터를 기본 128MB의 블록으로 나눕니다.

데이터 복제를 통해 HDFS는 일부 노드에 장애가 발생하더라도 데이터 가용성을 보장합니다.

HDFS는 클러스터에 더 많은 노드를 추가하여 수평으로 확장할 수 있습니다.

대규모 데이터 세트를 효율적으로 처리하도록 설계된 HDFS는 데이터에 대한 높은 처리량 액세스를 지원합니다.

HDFS의 구조

HDFS는 NameNodeDataNode라는 두 가지 기본 구성 요소가 있는 마스터-슬레이브 아키텍처를 따릅니다.

NameNode

NameNode는 파일 시스템의 메타데이터를 관리하는 마스터 서버입니다. 파일 이름, 디렉터리 및 데이터가 저장된 블록을 추적합니다.

NameNode는 파일 시스템 네임스페이스를 유지하고 클라이언트 요청을 처리하며 파일 및 디렉터리 열기, 닫기, 이름 바꾸기와 같은 파일 시스템 작업을 관리합니다.

블록 데이터를 클러스터의 데이터노드에 맵핑 하는 일을 수행합니다.

데이터노드의 생존 여부를 모니터링 합니다.

NameNode 2 (Standby NameNode) 구성

시스템에서 전체적인 일을 총괄하는 NameNode가 오류가 생겼을 시, 고가용성을 유지하기 위해서 마스터 노드2를 구성하기도 합니다.

DataNode

DataNodes는 실제 데이터 저장을 담당하는 슬레이브 서버입니다. HDFS의 각 파일은 블록으로 분할되며 이러한 블록은 여러 DataNode에 저장됩니다.

DataNode는 실행 중인 노드에 연결된 스토리지를 관리하고, 클라이언트의 읽기 및 쓰기 요청을 처리하고, NameNode의 지침에 따라 블록 생성, 삭제 및 복제를 수행합니다.

클러스터에 걸쳐 데이터를 복제합니다.

주기적으로 생존 정보를 NameNode에 보냅니다.

블록 구조

HDFS는 파일을 큰 블록(일반적으로 128MB 또는 256MB)으로 분할하여 DataNode에 분산시킵니다.

각 블록은 내결함성과 데이터 가용성을 보장하기 위해 복제됩니다(기본적으로 3회).

HDFS의 동작 방식

WORM 방식

write-once-read-many (WORM) 액세스 모델을 사용합니다. 파일을 작성하면 내용 수정이 불가한거죠.

파일 이동, 파일 삭제, 파일 이름 변경은 되지만 파일 내용의 변경을 허락하지 않습니다.

NameNode 동작

HDFS의 메타데이터 ( 디렉토리 정보, 파일 퍼미션 정보 등)를 메모리에 저장해 정보를 빠르게 제공합니다.

메타데이터는 fsimage라는 파일로 디스크에도 저장됩니다.

파일 생성이나 파일 삭제가 일어나면 메타데이터가 변경되어야 하고, 이것은 fsimage에 특정 시간마다 기록 합니다.

HDFS 파일 쓰기/읽기 동작

파일 쓰기

클라이언트는 파일 생성을 위해 NameNode에 요청을 보냅니다.

NameNode는 사용 가능한 DataNode를 확인하고 파일에 블록을 할당합니다.

파일이 크다면 블록 단위로 쪼개집니다.

클라이언트는 할당된 블록에 데이터를 쓴 다음 블록을 DataNode에 저장합니다.

DataNode는 NameNode의 지시에 따라 블록을 다른 DataNode에 복제합니다.

파일 읽기

클라이언트는 NameNode에 파일 읽기 요청을 보냅니다.

네임노드는 클라이언트에게 파일 데이터가 데이터 노드의 위치 목록을 전달 합니다.

이때 데이터노드는 네트워크 위상에 따라 클라이언트와 가까운 순으로 정렬됩니다.

클라이언트는 네트워크 상 거리가 가까운 데이터노드에 접근해 데이터를 읽습니다.

클라이언트가 블록을 읽기 시작하면 네임노드는 다음 데이터 블록들의 위치를 클라이언트에게 전달합니다

NameNode와 DataNode 간의 통신

초기 통신

데이터노드가 시작되면 데이터노드는 네임노드에 등록해 네임노드에게 HDFS 읽기/쓰기 오퍼레이션을 데이터노드에서 할 준비가 된 것을 알립니다.

정기적 데이터노드의 생존 여부 알림

모든 데이터노드는 주기적으로 (기본 3초) 데이터노드의 사용정보를 포함하는 heartbeat를 네임노드에 보냅니다

네임노드가 오랜 시간 동안 heartbeat를 받지 못하면 데이터노드가 죽은 것으로 판단합니다.

HDFS의 고가용성

고가용성을 위한 스탠바이 네임노드

액티브 네임노드는 메타데이터 변경 내용을 edit 로그에 기록을 합니다.

스탠바이 네임노드는 변경내용을 edit 로그를 읽어서 액티브 네임노드와 동기화 시킵니다.

Rack-awareness

데이터 지역성을 고려해 데이터의 복사본을 분산시키는 방법입니다.

스위치가 실패되더라도 데이터를 사용할 수 있도록 하기 위해서 복사본을 다른 Rack에 위치시킵니다.

참고한 자료

HDFS Architecture Guide (apache.org)

강좌: 빅데이터 프레임워크 (kmooc.kr)

참고하면 좋은 글

Leave a Comment

목차