티스토리 뷰
1. Hadoop 1.0의 구조와 YARN의 등장 이유
[ Hadoop 1.0의 구조와 YARN의 등장 ]
Hadoop 1.0의 MRV1(MapReduce Version1)는 작업의 처리와 자원의 관리를 한번에 관리하였다.
즉, Single-Master 노드에 해당하는 job Tracker는 자원을 할당하고, 스케줄링 작업도 수행하며 처리중인 작업까지 모니터링을 하였다. 그리고 하위 노드에 해당하는 Task Tracker에 Map and Reduce 작업을 부여하였고, 하위 노드들은 주기적으로 그들의 진행상황을 Job Tracker에 보고하였다.
이러한 MRV1구조는 Task의 규모가 커짐에 따라, 하나 뿐인 Job Tracker에 부하가 걸리며 bottleneck이 발생할 뿐만 아니라 컴퓨터의 자원이 비효율적으로 사용된다는 것을 알게 되었다. 그리고 이러한 문제를 해결하기 위해 Hadoop 2.0에서는 YARN(Yet Another Resource Negotiator)을 추가하였는데, 자원관리 및 작업 스케줄링에 대한 책임을 Yarn에 인수하여 MapReduce이 경량화되었으며, MapReduce 이외의 작업을 Hadoop이 처리할 수 있게 해주었다.
그래서 Hadoop 2.0은 위와 같은 구조로 재탄생하게 되었고. Yarn은 HDFS에 저장된 데이터를 바탕으로 그래프 처리, 대화식 처리, 스트림 처리 및 일괄 처리와 같은 일들을 수행할 수 있게 해주었다. YARN을 바탕으로 실시간 처리를 위한 Spark, SQL 전용의 Hive, NoSQL 전용의 HBase등 다양한 도구를 사용할 수 있다.
2. YARN의 구조
[ YARN의 전체적인 구조 ]
위에서 언급하였듯이 Yarn이 탄생하게 된 근본적인 아이디어는 Resource Management 기능과 Job Scheduling/Monitoring 기능을 분리된 데몬에서 처리하자는 것이다. 이를 구현하기 위해서 Global Resource Manager(RM)와 application 단위로 존재하는 Application Master(AM) 을 가지도록 하였다. 여기서 말하는 Application은 하나의 작업 또는 작업의 DAG(Directed Acyclic Graph, 비순환 방향 그래프)을 의미한다.
- Resource Manager: Master Daemon에서 구동되며, 클러스터들로의 자원 할당을 관리한다.
- Node Manager: Slave Daemon에서 구동되며, 각 단일 노드의 Task 실행을 담당한다.
- Application Master: 개별적인 응용에서 필요로 하는 자원과 Job에 대한 lifecycle을 관리한다. 이것은 Node Manager와 함께 작동하며, 작업의 실행을 모니터링한다.
- Container: 한 노드의 자원을 모아둔 패키지 (RAM, CPU, Network, HDD 등)
Resource Manager와 Node Manager는 데이터를 처리하기 위한 프레임워크를 형성한다. Resource Manager은 시스템의 모든 Application들 사이에서 자원을 관리/중재한다. Node Manager은 Machine 단위로 존재하는 Framework Agent로 Container를 관리하고, CPU와 Memory와 같은 자원의 사용량을 모니터링하며, Resource Manager로 정보를 전달한다.
Application단위로 존재하는 Application Master는 Resource Manager와 함께 자원을 협상하고, Task를 모니터링하고 실행하기 위해 Node Manager와 함께 작동한다.
이제 각각에 대해 자세히 살펴보도록 하자.
[ 1. Resource Manager ]
Resource Manager는 Resource Allocation에 대한 최상위 권위자로, 어디에 자원을 할당할지 결정하여 Cluster들의 활용을 최적화시킨다. 또한 일에 대한 처리 요청을 받으면, Request들의 일부를 해당하는 Node Manager로 전달한다. 이러한 역할을 수행하는 Resource Manager는 크게 2가지로 구성되는데, Scheduler와 Applications Manager이다.
1) Scheduler
Scheduler는 Capacities(용량), Queue(대기줄) 등의 제한조건에 따라 실행중인 다양한 Applications들에 자원을 할당한다. Resource Manager의 Scheduler는 Application의 상태를 추적하거나 모니터링하지 않는, 순수한 Scheduler이다. 또한 순수한 스케줄러이기 때문에 Hardware failures나 Application failures에 의한 재시작 역시 보장하지 않으며, Application들의 자원 요구에 기반하여 Scheduling 기능을 수행한다. 이것은 메모리, CPU, 디스크, 네트워크와 같은 요소들을 포함하는 (resource) Container를 기반으로 작동한다.
또한 Scheduler는 Plug-in Policy를 사용하는데, 현재는 Capacity Scheduler와 Fair Scheduler를 플러그인으로 사용한다. Capacity Scheduler는 Larger Cluster를 여러 사용자가 함께 사용하는 Multi-tenancy를 구현하여 할당된 용량의 제한하에 적시에 Application들에 응용을 할당할 수 있게 해준다. Fair Scheduler는 YARN으로 하여금 Larger Cluster들이 공평하게 자원을 공유할 수 있게 해준다.
2) Applications Manager
Applications Manager는 Job의 제출을 수락하고, Application Master를 실행하기 위한 첫번째 컨테이너를 설정하고 실패 시 Application Master의 Container를 재시작하게 해준다. Application Master는 Scheduler를 통해 적합한 Container를 선정하고, 그것을 Tracking하고 진행 상황을 모니터링하는 역할을 수행한다.
[ 2. Node Manager ]
Node Manager는 개별 노드들을 관리하고 주어진 노드에서 사용자의 작업 및 Work Flow를 관리한다. Node Manger는 Resource Manager에 등록되며 노드의 상태를 판별하기 위한 heartbeats를 전송한다. 그 중에서 Node Manager의 가장 중요한 임무는 Resource Manager을 통해 할당받은 Container를 관리하는 것이다. Container의 자원 사용량을 감시하고, 이를 Resource Manager로 보내는데, 문제가 발생한 경우 Resource Manager로부터 Container를 Kill하라는 명령을 받아 수행하기도 한다.
[ 3. Application Master ]
여기서 말하는 Application은 프레임워크에 제출된 단일 작업을 의미하며, 각각의 단일 작업은 고유한 Application Master를 지니게 된다. Application Master는 클러스터에서 응용의 실행을 조정하고 오류를 관리한다. 또한 Node Manager와 함께 작동하여 Task를 실행시키고 모니터링하며 Resource Manger를 통해 자원을 협상한다. 자원을 협상한 후에는 Resource Manager로부터 적당한 Resource(conatiner)를 할당받고 그것들의 상태를 추적하고 모니터링한다. 한번 Application Master가 실행되면 주기적으로 Resource Manager에 heartbeats를 전송하여 상태를 확인시켜주고, 자원의 요구사항을 갱신한다.
[ 4. Container ]
Container는 하나의 노드에 할당받은 자원들로, Container Life Cycle(CLC)에 해당하는 Container Launch Context를 통해 관리된다. 레코드에는 환경 변수 맵, 원격 액세스 가능한 스토리지에 저장된 종속성, 보안 토큰, 노드 관리자 서비스의 페이로드 및 프로세스를 만드는 데 필요한 명령이 포함된다. 또한 Container는 특정 호스트에서 특정 양의 자원 (메모리, CPU 등)을 사용하도록 응용 프로그램에 권한을 부여한다.
3. YARN의 동작 방식
[ YARN의 동작 방식 ]
- Client가 Resource Manager에게 Application에 대한 요청을 전송한다.
- Resource Manager는 Application Master와 함께 Application을 등록한다. (이때 Application ID가 생성되며, 후에 Client에게 반환된다.)
- Resource Manager는 각각의 분리된 Container에서 Application Master를 구동한다. 만약 Container가 구동 불가능하다면, 적합한 Container를 찾을 때까지 기다린다.
- Application Master는 Node Manager에게 Container의 실행 명령을 전달한다.
- Application 코드가 Container에서 실행된다.
- Client는 Application의 상태를 모니터링하기 위해 Resource Manager/Application Manager와 주고 받는다.
- Application Master가 Resource Manager에서 등록 해지된다.
[ YARN의 Reservation System ]
YARN은 Reservation System을 통해 Resource Reservation을 지원하는데, 이것은 사용자가 마감일과 같은 시간적 제약사항이 있는 경우에, 자원을 예약하여 중요한 작업의 실행을 보장하게 한다. Reservation System은 시간을 두고 자원을 추적하고, 예약에 대한 승인 제어 기능을 수행하며, 예약이 가득 채워져 있는지 확인하기 위해 Scheduler에 동적으로 지시한다.
수천 노드 이상으로 YARN을 확장하기 위해 YARN Federation 기능을 통해 연합이라는 개념을 지원합니다. Federation은 Transparent하게 여러 개의 Yarn Cluster를 묶어, 하나의 거대한 Cluster처럼 보이게 한다. 이것은 여러 개의 독립된 Cluster들이 거대한 일을 처리하기 위해 사용되도록 한다.
참고 자료
'나의 공부방' 카테고리의 다른 글
[Hadoop] Hadoop의 구조와 MapReduce (0) | 2021.02.03 |
---|---|
[Spark] Apache Spark란? (4) | 2021.02.03 |
[Frontend] VueJS 프로젝트 생성 및 설정하기 (0) | 2021.02.01 |
[Android] 안드로이드 프로그래밍 핵심 기술(MVVM 패턴과 RxJava) (0) | 2021.02.01 |
[프로그래밍] 함수형 프로그래밍(Functional Programming) 이란? (32) | 2021.01.22 |