NameNode
네임노드는 모든 메타데이터(HDFS 디렉토리 정보나 파일의 퍼미션 정보 등)를 메모리에 저장해 정보를 빠르게 제공한다.
이 정보들은 디스크에도 저장되는데 fsimage 파일로 디스크에 저장한다.
fsimage 파일 - HDFS에 있는 모든 파일 이름, HDFS 디렉토리 구조, HDFS에 있는 모든 파일의 퍼미션 구조
HDFS에서 파일 생성이나 삭제가 일어나면 메타데이터가 변경돼야 하는데 이 모든것이 fsimage(파일 시스템 이미지)에 즉시 반영되지는 않는다. 대신 변경 내용은 디스크의 다른 파일에 기록된다. 그리고 매 시간(기본값)마다 보조 네임노드가 변경된 내용과 fsimage 파일을 합치는 작업을 하고 이렇게 만들어진 정보가 새로운 fsimage 파일로 기록된다.
네임노드가 HDFS 메타데이터를 램(메모리)에 저장하는 이유는 클라이언트가 HDFS 데이터에 접근하려고 할 때 데이터에 빠르게 접근할 수 있도록 하기 위함이다. 클라이언트는 데이터노드에 직접 접근할 수 없어서 네임노드로 접근하고 네임노드는 파일의 블록 넘버나 데이터 위치(데이터노드)와 같은 정보를 클라이언트에게 전달한다.
<진행 순서>
fsimage - 변경된 정보는 디스크 파일에 트랜잭션 로그 저장 - 세컨더리 네임노드는 주기적으로 fsimage와 로그 파일을 통합한다 - 네임노드는 이 모든 작업이 끝나고 나면 변경 내용을 기록한 파일(로그)을 삭제한다.
Secondary NameNode
네임노드가 없으면 어떤 데이터노드에 어떤 블록들이 파일로 저장되어 있는지 알 수 없다.
edits 파일 : fsimage(네임노드 메타데이터 파일)에 대한 트랜잭션 로그 파일, HDFS의 메타데이터 변경 기록
세컨더리 네임노드는 주기적으로 fsimage 파일의 체크포인트를 실행한다.
체크포인트는 세컨더리 네임노드가 fsimage와 edit 파일을 통합하는 작업이다.
세컨더리 네임노드는 주기적으로 네임노드에 edit 로그를 요청한다. 세컨더리 네임노드는 네임노드로부터 받은 edit 로그로 fsimage를 업데이트한다. 그리고 업데이트된 fsimage를 네임노드에 복사한다.
Standby NameNode
네임노드가 관리하고 있는 메타데이터는 극도로 중요한 부분이기 때문에 HDFS 고가용성 설정을 위해 사용한다.
standby 네임노드가 세컨더리 네임노드가 하는 네임스페이스 체크포인트 기능을 대신 수행한다.
네임노드는 edit 로그를 이용해 HDFS 메타데이터의 최신 상태를 얻는데, 네임노드의 고가용성을 유지시켜주는 키는 액티브 네임노드와 스탠바이 네임노드가 서로 공유할 수 있도록 하는 데 있다. 주로 QJM(Quorum Journal Manager)을 설정한다.
NameNode의 HA 아키텍처(QJM)
HA 환경에서 2개의 네임노드 간 동기화는 QJM을 이용한다. 2개의 네임노드 서비스 이외에 클러스터에서 동작하는 저널노드(JN, Journal Node) 세트를 가진다. Active 네임노드는 HDFS 메타데이터를 변경할 때, 변경 내용을 저널노드에 기록한다.
- 저널노드의 역할
standby 네임노드는 Active 네임노드의 상태를 일치시키기 위한 방법으로 JN 데몬을 통해 통신한다.
standby 네임노드는 JN을 모니터링하면서 JN의 모든 edit들을 자신의 네임스페이스에 적용한다.
JN의 임무는 어떤 시점이든 하나의 네임노드만이 네임스페이스에 변화를 줄 수 있다는 것을 보장하는 것이다.
- 고가용 구성이 동작하는 방식
클라이언트는 active 네임노드에 연결하지만 데이터노드들은 하트 비트를 2개의 네임노드에 보낸다. active 네임노드는 메타데이터를 JN에 기록하고 standby 네임노드는 JN에서 메타데이터를 지속적으로 읽어 active 네임노드와 동기화 되도록 유지한다.
JN은 공유된 edit 스토리지를 제공한다. active 네임노드가 이 스토리지에 기록하면 standby 네임노드가 여기서 데이터를 읽어 액티브 네임노드에 의해 변경될 모든 변경을 반영한다.
-
active 네임노드는 다수의 저널노드에 기록해야 하기 때문에 저널노드 데몬은 홀수로 실행해야 한다. 따라서 저널노드 데몬은 최소한 3개를 설정한다.
active 네임노드는 메타데이터의 변경을 JN의 저널매니저에 기록하는데 이때 active 노드는 JN의 다수에게서 성공했다는 결과를 얻을 때까지 기다린다. 과반의 응답을 받는다는 것은 저널노드 하나가 제대로 동작하지 않는다고 하더라도 영향을 미치지 않는다는 것을 보장한다.
* Apache Zookeeper
중앙 집중식 서비스로 하둡의 HDFS를 위해 분산 동기화와 그룹 서비스를 제공한다.
네임노드가 가진 고가용성이라는 특징은 주키퍼 서비스에 의존한다. 주키퍼 서비스를 이용하면 분산 애플리케이션을 개발하는 데 있어 분산 환경에 필요한 신뢰할 수 있는 통합, 그룹 관리 그리고 필요한 프로토콜을 개발하지 않아도 된다.
YARN 아키텍처
YARN은 리소스매니저에 의존한다. 리소스매니저는 하둡 클러스터에서 동작하는 모든 애플리케이션 사이에 중재자 역할을 한다.
그리고 클러스터에 있는 모든 워커 노드(데이터노드)를 관리하는 노드매니저와도 협력한다.
YARN 위에서 동작하는 각각의 애플리케이션은 애플리케이션마스터(AM)을 가진다.
애플리케이션마스터는 리소스에 대해 리소스매니저와 협상하고, 각 애플리케이션의 태스크를 실행하기 위한 노드매니저들과 연동한다.
Job : 하나 이상의 task를 포함하는 애플리케이션 (예: 맵리듀스-맵퍼, 리듀서, 프로세싱할 입력 리스트)
YARN은 맵퍼와 리듀서의 수를 결정한다.
리소스매니저 : 스케줄링과 리소스 관리 담당
노드매니저 데몬 : 각 데이터노드에서 동작하면서 컨테이너 실행 관리
리소스매니저가 애플리케이션매니저를 만들고, 잡별로 애플리케이션 매니저가 존재한다.
YARN은 컨테이너를 사용해 애플리케이션을 실행한다. 컨테이너는 메모리와 프로세싱 코어(CPU)와 같은 다른 리소스의 양을 구체적으로 표현하는 논리적 구조이다.
각각의 하둡 잡은 다수의 태스크를 가지고 - 각 태스크들은 자신이 속한 컨테이너 내에서 동작한다.
컨테이너는 태스크가 시작할 때 생성되며 완료되면 소멸하고 리소스는 다른 태스크에 할당된다.
리소스매니저 : 컨테이너를 각 애플리케이션에 할당
노드매니저 : 컨테이너의 라이프사이클 관리
리소스매니저 : 컨테이너 스케줄링
Client에게 요청이 왔을 때 YARN에서 리소스를 할당하고 요청을 처리하는 방법
1. RM은 Client의 요청을 받고 애플리케이션을 위한 첫 번째 컨테이너를 만든다. 이 컨테이너에서 애플리케이션마스터가 실행된다.
애플리케이션 마스터의 요청을 받은 리소스매니저는 노드 매니저에게 컨테이너 생성을 요청하고,
노드 매니저는 필요한 태스크 수만큼 컨테이너를 할당한다.
2. 컨테이너가 성공적으로 할당되면 애플리케이션마스터는 컨테이너의 실행 스펙을 노드매니저에게 제공하여 컨테이너를 실행시킨다.
애플리케이션 마스터는 컨테이너에서 실행된 Task(Map)의 실행 결과를 받는다.
3. Reduce job 실행을 위한 과정
애플리케이션마스터는 리소스매니저에게 리듀서 태스크를 요청한다.
애플리케이션마스터는 리소스 매니저가 할당해준 노드의 노드매니저에게 리듀스태스크를 시작하도록 요청한다.
노드매니저는 리소스매니저에게 작업 진행 정도나 노드 상태 등을 보낸다.
애플리케이션마스터는 모든 태스크가 완료되면, 클라이언트 애플리케이션에 결과를 전송한다.
(클라이언트는 응용프로그램 실행 중의 상태, 진행률을 얻기 위해 AM과 직접 통신한다.)
리소스 매니저
리소스매니저는 클러스터마다 하나만 존재한다.
리소스 매니저의 역할
- 잡 스케줄링과 실행 관리
- 모든 데이터노드의 리소스 할당
리소스 매니저의 주요 기능
- 애플리케이션을 위한 첫 번째 컨테이너를 만든다. 여기서 애플리케이션 마스터가 실행된다.
- 데이터노드를 관리하기 위해 노드매니저의 하트비트를 관리한다.
- 클러스터 사이에 리소스 할당을 결정하기 위해 스케줄러를 실행한다.
- 애플리케이션에서 온 리소스를 요청 처리한다.
- 애플리케이션마스터의 상태를 관찰하고, 실패할 경우 컨테이너를 재시작한다.
- 애플리케이션이 완료되거나 소멸된 후, 컨테이너 할당을 해제한다.
리소스매니저는 그저 스케줄일 뿐이다. 단순히 애플리케이션이나 프레임워크의 종류에 관계없이 리소스들을 애플리케이션에 할당한다.
노드매니저
각각의 데이터노드는 얀 기능들을 수행하기 위해 노드매니저를 실행한다.
노드매니저의 기능
- 하트비트와 컨테이너 상태 알림을 통해 리소스매니저와 정보를 주고받는다.
- 애플리케이션 프로세스를 등록하고 시작한다.
- 애플리케이션마스터를 시작하고, 애플리케이션 매니저의 응답에 따라 애플리케이션 리소스 컨테이너와 컨테이너에서 동작하는 맵과 리소스 태스크를 시작한다.
- 애플리케이션 컨테이너의 라이프 사이클을 관리한다.
- 컨테이너의 리소스 사용량과 관련된 정보를 관리, 제공한다.
- 데이터노드의 상태 추적
즉, 노드매니저 프로세스는 자신이 실행되는 데이터노드에서 사용되는 리소스 사용을 관리하고, 사용한 리소스를 리소스매니저에게 전달한다.
애플리케이션마스터
각각의 얀 애플리케이션에는 하나의 전용 애플리케이션마스터가 있다.
애플리케이션 마스터의 주요 기능
- 태스크 스케줄링과 실행 관리
- 애플리케이션 태스크를 위해 로컬 리소스 할당
애플리케이션마스터는 애플리케이션이 요구하는 리소스를 제공한다.
매번 새로운 애플리케이션이 시작될 때, 리소스매니저는 클러스터의 한 노드에 애플리케이션마스터를 실행하는 컨테이너를 할당한다.
애플리케이션이 시작되면 시작하고 완료되면 종료된다.
References
빅데이터 전문가의 하둡관리, SAM R. ALAPATI
'데이터 엔지니어링' 카테고리의 다른 글
Kafka란? (3) 내부 동작 원리 replication/controller/log segment (0) | 2022.08.07 |
---|---|
ElasticSearch 구성 요소 - Shard, Replicas, Analyzer (0) | 2022.08.04 |
Hadoop이란? (1) (0) | 2022.08.02 |
Impala의 Architecture와 Components에 대한 정리 (0) | 2022.07.31 |
DataLake vs DataWarehouse vs DataMart (0) | 2022.07.30 |
댓글