이전 포스팅에서 언급했던 HDFS에 대한 개념에 연장선인 Namenode와 Datanode에 대해서 알아보려 한다.
간단하게 정리하면 Namenode는 master역활로서 hdfs에 있는 데이터 datanode에 분산시키고 관리하는 기능을 담당한다. 즉, slaves에 해당하는 datanode에게 I/O를 담당하고 datanode의 이상유무를 체크하는 일을 처리하는 역할이다.
Datanode는 자신에게 할당된 데이터 블록을 처리하는 역할을 한다.
NameNode
HDFS에서의 master인 NameNode는 분산환경에서 저장기능을 담당한다. 즉, 실제 작업의 대상이 되는 파일을 블록(block)단위로 나누어서 slave node들에게 분배할 뿐만 아니라 전체적인 (분산) 파일시스템의 이상 유무도 체크하고 slave 컴퓨터인 DataNode에서의 데이터 입출력 작업 (low-level I/O tasks)을 지휘한다. 이러한 작업은 메모리 소모도 크고 입출력도 많이 일어나므로 NameNode에 이상이 발생하면 Hadoop 클러스터는 전체적으로 동작을 멈추게 된다.
파일시스템에서 메타데이터 관리의 신뢰성도 중요하다. 특히 데이터 파일은 “write once, read many” 형태를 취하지만 메타데이터 (예: 파일 및 디렉토리 이름 등)만큼은 여러 클라이언트 컴퓨터가 동시에 수정을 시도할 수 있으므로 동기화 기능이 중요하기 때문에 NameNode가 별도의 컴퓨터에서 관리한다. NameNode는 파일시스템의 모든 메타데이터를 관리하는데 파일당 메타데이터의 크기가 작으므로 (파일명, 사용권한, 각각의 블록의 위치 정도만 관리) 이들 메타정보는 NameNode 기기의 메인메모리에 상주시켜 이용한다. 이처럼 한 클러스터에는 단 한 개의 NameNode가 존재하고 master node로 지정된 컴퓨터가 NameNode를 전담관리하며 다른 작업은 일체 하지 않는다.
클라이언트는 NameNode에게 질의하여 메타데이터 즉, 특정 파일의 블럭의 목록 등은 NameNode를 통해 메인메모리로부터 가져오지만 이후의 작업은 NameNode의 간섭 없이 DataNode로부터 병렬로 직접 read 작업을 수행한다. 이처럼 NameNode의 관여없이 데이터를 통째로 가져오기 때문에 효율이 높아진다.
개별 DataNode가 장애를 일으키는 경우에도 전체적인 시스템의 이용은 유지되지만 NameNode의 장애는 시스템 전체의 이용이 불가능한 상태를 초래한다. 다만 일상적인 작업현장에서 DataNode와는 달리 NameNode는 주도적 역할을 하지 않기 때문에 장애의 위험성은 훨씬 적다. 만전을 기하기 위해 NameNode를 이중으로 가져가려는 노력이 있을 수 있는데 그 방법이 secondary NameNode를 이용하는 것이다.
DataNode
Hadoop cluster에서는 데이터를 읽어 들이는 즉시 각각의 node에 데이터가 분배된다. HDFS는 큰 데이터 파일을 여러 개로 분리시켜서 각각의 node가 이를 처리하게 하는데 이들 각각의 조각(chunk) 는 여러 대의 컴퓨터에 중복적으로 복제되어서 한 컴퓨터에서 장애가 발생해도 다른 컴퓨터를 통해 데이터를 이용할 수 있다. 또한 모니터링 시스템을 지정해서 저장된 데이터의 일부에 문제가 발견될 때 이를 다시 복제하도록 조처한다. 이때 이들 모든 파일조각들은 하나의 namespace를 공유하므로 클러스터 내의 모든 node들은 이를 이용할 수 있다. slave 기기는 DataNode daemon[4]을 통해 분산파일의 read/write 작업을 수행한다. 그리고 이때 DataNode 데몬 프로그램은 다른 DataNode와 통신하면서 자신의 데이터 블럭을 복제하기도 하고 직접 처리작업을 수행한다.
실제로 HDFS의 분산파일시스템을 대상으로 한 읽기 및 쓰기의 모든 작업이 이루어진다. 모든 작업은 대상 파일을 random하게 블록(block) 단위로 나누어 진행하는데 이들 DataNode의 작업은 수시로 NameNode에 보고되고 그 내역은 NameNode에 메타데이터의 형식으로 저장된다.