Experiences/Hadoop

2-1. 하둡의 구성요소

프로그래머 2012. 8. 29. 01:30

이번 파트에서는 하둡의 물리적 컴포넌트에 대해 설명하고, 클러스터의 구축에 대해 설명하려고 한다.

또한 하둡의 세 가지 실행모드를 자세히 다룬다.

마지막으로 사용자의 클러스터를 모니터링 하기 위한 웹 기반 도구에 대해 공부한다.


하둡을 실행한다는 것은 네트워크상의 서로 다른 서버에서 여러 개의 데몬(daemon) 또는 상주 프로그램들을 실행 한다는 것을 뜻한다. 


이러한 데몬은 특별한 역할을 한다.

하둡의 데몬의 종류는 다음과 같은 것들이 있다.


- NameNode

- DataNode

- Secondary NameNode

- JobTracker

- TaskTracker


각각에 대해서 알아보자!


1. NameNode



가장 필수적인 하둡 데몬은 NameNode이다.

하둡은 분산 저장분산 연산에 대해 master/slave 구조를 가지고 있다.


이 분산 저장 시스템은 하둡 파일 시스템(HDFS)이라고 한다. 

NameNode는 HDFS의 master 역할을 하는데 slave인 DataNode 데몬에게 I/O 작업을 지시한다.


NameNode는 어떻게 파일이 블록 단위로 나누어져 있는지, 어느 노드가 해당 블록을 가지고 있는지와 분산 파일 시스템의 전반적인 상태를 알고 있다.


NameNode는 주로 메모리와 I/O에 관한 일을 담당하고, NameNode를 담당하는 서버는 작업량을 덜기 위해 데이터를 저장하지 않고, MapReduce 프로그램을 위한 어떤 연산 작업도 담당하지 않는다.


NameNode 서버는 DataNode나 TaskTracker처럼 복수로 구성되지 않는다.


NameNode의 단점이 하나 있는데, 하둡 클러스터에서 단일 실패 지점을 가진다는 점이다.

다른 데몬의 경우 제공되는 노드가 소프트웨어나 하드웨어의 어떤 이유로 실패하게 되면, 하둡 클러스터는 해당 기능이 자연스럽게 지속될 수 있도록 조치를 취하거나 바로 재실행을 실시한다. 


그러나 NameNode는 단일 실패 지점을 가지고 있기 때문에 이러한 처리를 할 수 없다.


2. DataNode


클러스터에 포함되어 있는 slave 머신에는 DataNode 데몬이 존재하는데, 이것은 로컬 파일 시스템에 위치한 파일에 HDFS 블록을 기록하거나 해당 파일을 읽는 등의 단순한 기능을 수행한다.


아래 사진은 NameNode와 DataNode의 역할을 보여준다. 그림에서 시스템은 두개의 데이터 파일을 가지고 있다. 하나는 /users/sammeerp/data/part-0에 위치하고 있고 다른 파일은 /users/sammeerp/data/part-1에 위치하고 있다. 


파일 part-0은 2개의 블록으로 구성되어 있고 각 블록은 1, 3라고 하자. 또한 part-1은 블록 2, 4, 5로 구성되어 있다. 파일 내용은 DataNode에 분산되어 있다.



NodeName은 파일의 메타데이터 정보를 보관한다.

메타데이터는 어떤 파일이 있는지, 어떻게 블록으로 나누어지는지에 대한 정보가 들어있다.


DataNode는 블록의 백업 저장소 역할을 한다. 

그리고 지속적으로 현재 시점의 메타데이터를 가질 수 있도록 NameNode에게 계속 보고한다.


part-0 블록은 2개의 사본을 가지고 있고, part-1은 3개의 사본을 가지고 있다. 

예를 들면 part-0 블록은 그림에서 ①번과 ③번에 복사되어 있는 것을 볼 수있다.


이러 인해 하나의 DataNode가 깨져서 네트워크를 통해 접근이 안된다고 할지라도 사용자는 계속 파일을 읽을 수 있다.


3. Secondary NameNode(SNN)



Secondary NaneNode는 클러스터로 구성된 HDFS의 상태를 모니터링 하는 보조 성격을 가진 데몬이다.

각 클러스터는 하나의 SNN을 가지며, 일반적으로 SNN을 위한 전용 서버에서 실행된다.


그리고 DataNode 또는 TaskTracker 데몬을 SNN에 구성하지 않는다.


SNN은 NameNode와 달리 실시간으로 발생하는 HDFS의 변경에 관한 어떤 정보도 기록하지 않는다.

대신, 클러스터  설정 시 정의된 값을 가지고 주기적으로 HDFS 메타데이터(metadata)의 스냅샷을 찍는다.


앞에서 말했지만, NameNode는 단일 실패 지점을 가지고 있기 때문에 SNN 스냅샷은 데이터의 손실과 시스템의 정 시간을 최소화하는 데 사용된다.


NameNode에 오류가 발생한 경우 SNN이 대신 NameNode로 대체되는데, 클러스터의 환경 설정 작업은 수작업으로 이루어진다는점을 알아두자. 복구 프로세스에 대해서는 나중에 자세히 공부해보자!


4. JobTracker



JobTracker는 클러스터 노드에서 실행되는 사용자 애플리케이션들을 관리한다.

사용자가 코드를 하둡 클러스터에 넘기면 JobTracker는 여러 가지 실행 계획을 결정하게 되는데, 예를 들어 어느 데이터 파일을 처리할지 결정하고, 노드에 여러 태스크를 할당한다.


또한 실행되는 모든 태스크를 모니터링하고, 태스크가 실패한 경우 자동으로 실패한 태스크를 재실행한다. 재실행 시 실패한 태스크는 다른 노드에 새로 할당되어 실행한다.


하둡 클러스터에는 하나의 JobTracker 데몬만 존재한다. JobTracker는 클러스터의 master 노드에서 실행된다.


5. TaskTracker



NameNode 데몬과 마찬가지로, 연산에 관련된 데몬도 master/slave 구조를 가진다.

JobTracker는 master로서 MapReduce의 전체적인 실행을 감독한다. (NameNode와 비슷한 느낌이라고 해야하나?)


TaskTracker는 각 slave 노드에 할당된 작업의 실행을 담당한다.

아래 그림은 JobTracker와 TaskTracker가 어떻게 서로 연관되어 있는지 보여준다.



사용자(Client)가 JobTracker에 데이터 처리를 요청하면, JobTracker는 해당 작업을 분할하고 서로 다른 map과 reduce 작업을 구성한 뒤 클러스터에 있는 각각의  TaskTracker에 할당한다.


TaskTracker의 또 다른 일은 JobTracker와 계속해서 통신하는 것이다.

JobTracker는 이를 통해 현재 가용한 TaskTracker에게 Map 작업 또는 Reduce 작업을 할당하거나, 작업 진행 상황 등의 정보를 포함하는 heartbeat를 주기적으로 전송한다.


만약 정해진 주기 내에 도착하지 않을시에는 해당 TaskTracker에 문제가 생긴 것으로 간주하고 해당 작업을 클러스터 내에 위치한 다른 노드에 할당한다.




이 그림은 하둡 클러스터의 전형적인 구조를 보여준다.

master/slave의 구조를 가지고 있고, NameNode와 JobTrackermaster에 해당하고, DataNode와 TaskTrackerslave에 해당한다.


Name Node와 JobTracker 데몬을 실행하는 master 노드가 있고 master 노드에 문제가 생길 경우를 대비해, SNN이 별도의 노드에 위치해 있다. 


클러스터가 작은 경우에는 SNN이 slave 노드 중 하나에 위치할 수 있고, 큰 경우에는 NameNode와 JobTracker를 서로 다른 서버에 분할해 배치할 수 있다.


slave에 해당하는 컴퓨터들은 DataNodeTaskTracker를 제공하는데, 이들은 해당 노드에서 작업을 실행한다. 이때 데이터 역시 같은 노드에 저장되어 있어야 한다.


여기까지 하둡의 구성요소에 대해서 알아보았다. 

부족한 점이 많고, 서투른 설명들이 많지만, 궁금한 사항들은 댓글에 남겨놓으면 알아보고 답변해드리겠다.


그리고 이제는 앞에서 이야기한 형태의 하둡을 구성하는 단계로 넘어가자.