HDFS 아키텍쳐
- HDFS는 Master-Slave 구조를 가지고 있다.
- Master 역할을 하는 서버(노드)를 네임노드(NameNode)라고 부른다.
- Slave 역할을 하는 서버(노드)를 데이터노드(DataNode)라고 부른다.
- HDFS에 파일이 저장될 때 네임 노드는 해당 파일의 메타 정보를 저장하고, 데이터 노드는 실제 파일 내용을 저장한다.
NameNode의 역할
- 메타 데이터 관리
- 저장된 파일의 메타 정보를 관리한다. 메타 정보는 파일 속성 정보를 의미하며, 파일이 어떤 노드에 저장되어 있는지, 몇 번째 블록인지, 크기는 얼마인지 등의 정보를 가지고 있다.
- 메타 데이터는 메모리 상에서 관리하므로, 파일 정보를 얻는 작업은 상대적으로 빠른 응답성을 가진다.
- HDFS 사용 현황 관리
- HDFS에서 사용 중인 용량 정보를 관리하고, Replication 된 데이터 중 유실된 데이터를 다른 데이터 노드에 복제한다.
- 클라이언트로부터 I/O 요청 접수
- 클라이언트가 HDFS에 작업 요청을 진행하면 NameNode가 앞 단에서 응답한다.
- 클라이언트가 요청한 파일에 대한 정보만을 반환하고, 실제 I/O 작업은 클라이언트와 데이터노드 간에 일어난다.
- 데이터노드 다운 여부 감시
- 데이터 노드는 주기적으로 네임노드에게 HeartBeat 패킷을 전송한다.
- Heartbeat 패킷을 송신하지 않는 데이터노드를 고장이라 판단하고, 고장난 노드에 저장되어 있는 파일(메타 정보를 이용하여 어떤 파일인지를 알 수 있고, 다른 노드에 해당 파일이 복제되어 있다)을 다른 노드에 다시 복제하여 Replication 수를 맞춘다.
DataNode의 역할
- HDFS를 통해 투입된 데이터들을 저장/유지하는 역할을 한다.
- 하나의 파일은 지정된 블록 크기만큼 쪼개져서 DataNode들에 저장된다.
- 하나의 블록은 Replication 수에 따라 N개의 DataNode에 중복 저장된다.
- 랙이 2개 이상이라면, 동일한 랙의 서버에 Replication을 하지 않는다. 랙 간 통신이 두절될 경우 다른 랙에 있는 데이터를 참조할 수 없기 때문이다. 이를 RackAwareness라고 한다.
Secondary Name Node의 역할
하둡이 관리하는 파일들의 메타데이터는 NameNode의 메모리에 올려져 있다. 하지만 계속 메모리에만 메타데이터를 유지하는 경우 서버가 불의의 사고로 재부팅되었을 때, 메타 데이터가 유실될 수 있다. 이러한 사고를 방지하기 위하여 하둡은 editslog와 fsimage라는 두개의 파일을 생성한다.
editslog
HDFS의 모든 변경 이력을 저장한다. 클라이언트가 파일에 대해 수행하는 모든 작업은 메타데이터와 editslog에 남게 된다.
fsimage
메모리에 저장된 메타데이터 정보를 가지고 있는 파일이다. 네임노드 구동 후에는 변경 사항이 메타데이터에만 적용되므로, 저장된 fsimage는 네임노드 구동 시의 메타 데이터만을 가지고 있다.
NameNode 구동 시 메타데이터 구성
- 네임노드가 구동되면 로컬에 저장된 fsimage와 editslog 조회
- fsimage를 이용하여 메타데이터 구성
- editslog를 이용하여 변경 이력을 메타데이터에 적용
- 메타데이터를 fsimage로 저장
- editslog 초기화
만일 오랜 시간 네임노드가 구동되어 있었다면, editslog의 크기가 매우 커질 것이고, 이를 메모리에 올리지 못해 하둡이 시작되지 못하는 경우가 발생할 수 있다.
이러한 문제를 방지하기 위하여 주기적으로 보조 네임노드에서 네임 노드의 editslog와 fsimage를 가져와 editslog 정보로 fsimage를 갱신시키고 editslog를 초기화하여 editslog의 크기를 줄이는 작업을 체크포인팅(checkpointing)이라 부른다.