대용량 파일 읽기 및 쓰기 작업에 최적화된 특별한 파일 시스템이다.
로컬 파일 시스템과 HDFS는 분리되어 있기 때문에, 데이터 작업이 필요한 사용자는 HDFS에서 로컬 파일 시스템으로 가져와서 작업해야한다. 이후 작업을 마친 파일을 로컬 파일 시스템에서 HDFS로 내보낸다.
HDFS에 파일을 저장하면, 파일의 데이터를 작은 단위의 블록으로 분할한 후 하둡 클러스터의 여러 노드에 이중으로 저장한다.
HDFS에서 파일을 가져오면, 분할된 블록을 합쳐 하나의 파일로 만든 후 로컬 파일 시스템에 저장한다.
파일은 기본적으로 64MB 혹은 128MB의 블록으로 나뉘어져 여러 개의 데이터노드에 분산 저장된다. 복제본의 수는 설정 가능하며 기본값은 3개이다. 파일의 메타정보는 마스터 노드의 네임 노드가 관리하고 실제 블록 데이터는 작업 노드인 데이터 노드에 분산 저장된다.
Name Node
실제 파일 내용은 저장하지 않고, 해당 파일들의 메타정보를 보관하는 역할을 수행한다.
메타정보
HDFS에 저장되어있는 파일의 위치, 사용자, 권한 등에 대한 정보와 각 블록의 이름과 위치정보를 담는다.
FSImage
HDFS에 저장되어있는 모든 파일의 메타정보를 영속화 한 스냅샷 이미지이다.
Edit log
클라이언트가 요청한 쓰기 동작의 트랜잭션들을 기록한 로그이다.
네임노드가 작동이 중단될 시, HDFS 또한 사용이 불가하게 된다. 이러한 점을 방지하기 위해 클러스터에는 2개의 네임노드를 구축하여 활성 대기(Active-Standby) 형태로 무중단 시스템으로 운영한다.
클라이언트로부터 특정 파일에 대한 요구 발생 → 해당 파일을 보관하고 있는 블록들에 대한 정보 탐색 → 실제 데이터가 보관되어있는 데이터 노드에 대한 위치 응답
Data Node
블록들은 복제를 통해 여러 개의 데이터 노드에 저장된다.
데이터노드의 복제 로직은 하나의 복제본이 손실되어도 결함없이 사용할 수 있도록 신뢰성을 보장하고, 데이터 노드 레벨에서의 원활한 작업 수행을 위해 데이터 이동 없이 블록이 저장된 곳에서 수행할 수 있도록 데이터 지역성을 향상한다.
HDFS High Availability Structure
Secondary Name Node
유일한 네임노드를 배정한다면, 단일 실패 지점의 오류로 인해 전체 시스템의 작동을 중단할 가능성이 있다. 이 때문에 기존의 HDFS는 가용성을 증가시키기 위해 추가적으로 보조 네임노드를 장착하였다.
보조네임노드는 최신의 FSImage 스냅샷을 생성하는 역할을 하지만, 네임노드 중단 시 직접적으로 개입하여 운영되진 않는다.
보조네임노드는 활성화 된 네임노드의 N번째 fsimage와 N번째 edit log를 통해 N+1번째 fsimage를 생성한 후, 네임노드가 가지고 있는 fsimage를 대체하고 edit log를 초기화시킨다.
Active-Standby Name Node
보조네임노드는 활성화 된 네임노드의 fail 시 복구를 돕지만 역할을 인계받지는 못하기 때문에, 고가용성을 보장하진 못한다. Hadoop v2 이후로는 활성-대기 네임노드의 도입을 통해 이를 해결하였다.
스냅샷 생성의 역할은 대기 네임노드가 수행하기 때문에 별도의 보조 네임 노드는 필요없으며, 대기 네임노드는 항상 활성 네임노드와 같은 정보 상태를 유지한다. 활성 네임노드에 장애가 발생할 시, 자동으로 활성 네임노드로 전환되어 지속적으로 작동한다.
각종 명령어
HDFS 아키텍쳐 및 커맨드 환경
$ hdfs dfs <COMMANDS> <ARGUMENTS>
Shell
복사
기본적인 hdfs 명령어 구조
-command and arguments | description |
-ls / | 루트 디렉토리 내의 파일 나열 |
-mkdir /new | 루트 디렉토리 하위에 new 디렉토리 생성 |
-put test /new | 로컬 디렉토리에 있는 test 파일을 /new 디렉토리로 복사 |
-get /new/test testlocal | HDFS내 /new/test 파일을 로컬의 testlocal 디렉토리로 복사 |
-cp /new/test /new/test.hdfs | HDFS내 /new/test파일을 HDFS내 /new 디렉토리에 test.hdfs란 이름으로 복사 |
-rm /new/test.hdfs | HDFS내 /new/test.hdfs 파일을 삭제 |
-rm -r /new | HDFS내 /new 디렉토리를 삭제 |