- Authors

- Name
- Youngju Kim
- @fjvbn20031
YARN의 탄생 배경.
Hadoop이 version 1 이었을 때는 오직 Mapreduce만이 데이터를 가공 및 처리할 수 있는 수단이었고, 자원관리 스케쥴링까지까지 담당하던 mapreduce의 구성요소인 Job Tracker에게 부하가 걸리며 bottleneck이 되었다. Hadoop version 2에서는 이러한 문제를 해결하기 위해 YARN이 도입이 되었고, 자원관리 및 스케쥴링에 대한 책임을 분리하고 전보다 범용적인 어플리케이션을 Hadoop에서 실행할 수 있게 되었다.
YARN architecture

Client는 Resource Manager로 Job을 제출하게되고, RM은 Node Manager 중 한 대에 Application Master를 배정 합니다. 이 Application Master는 이름에서 추측할 수 있듯이 Application마다 하나만 존재하는 life cycle을 총괄하는 중요한 프로세스이며 container를 통해 구동된다. 이 AM은 Resource Manager에게 실행을 위해 필요한 자원할당을 요청하고, Container라는 묶음으로 관리되는 논리적인 resource(CPU, Memory)를 할당받아 Job을 구동하게 됩니다.
YARN의 구성 요소
-
ResourceManager (RM): 클러스터 수준의 자원 관리: 전체 Hadoop 클러스터의 자원을 중앙에서 관리합니다. Scheduler: 애플리케이션에 필요한 자원을 할당하는 스케줄러 역할을 합니다. 이 스캐쥴러는 pluggable 하여 운영자가 policy plugin을 선택할 수 있고, 많이 사용되는 것은 capacity, fair, SLA scheduler가 있다. Applicationd의 상태는 모니터링 하지 않고, 어플리케이션의 장애나 H/W failure에 대한 restart와 같은 작업도 진행하지 않는다. 리소스 요구사항을 기반으로 한 기능만 수행한다. Application Manager: 애플리케이션의 라이프사이클을 관리하며, 애플리케이션 제출, 실행, 종료 등의 작업을 처리합니다. Job의 제출을 받아주고, Application Master가 실행될 첫번 째 컨테이너를 선정하고, 이후 실패(장애)에 대해 Application Master container를 재시작 하는 역할을 한다.
-
NodeManager (NM): 각 노드에서 실행되며 해당 노드의 자원 사용량과 상태를 모니터링합니다. ResourceManager의 지시에 따라 컨테이너를 시작하거나 종료합니다.
-
ApplicationMaster (AM): 각 애플리케이션마다 하나씩 인스턴스화되며, 애플리케이션의 실행을 관리합니다. ResourceManager에 자원 요청을 하고, NodeManager에게 실제 작업을 실행시킵니다. 애플리케이션의 진행 상태를 모니터링하고 필요시 리소스를 조정합니다.
-
컨테이너 (Container): 애플리케이션 실행에 필요한 자원(CPU=v-core, Memory=v-mem 등)의 묶음입니다. ResourceManager에 의해 할당되며, NodeManager에 의해 관리됩니다.
YARN과 HDFS의 관계는 의존적인가?
거의 대부분의 YARN은 HDFS 위에서 동작하고, Hadoop binary에도 포함되어있기 때문에 dependency가 있을 것이라고 생각할 수 있지만, 이는 오해이다. YARN은 HDFS와 가장 궁합이 잘 맞는 도구인 것은 분명하지만, HDFS는 storage 영역을 담당하고, YARN은 리소스 관리를 담당하는 독립적인 컴포넌트이다.
YARN Job 제출 및 실행 흐름.

-
Client가 Resource Manager에게 Job 제출. (이 때 Client는 Application ID를 발급받아야하는데, ClientRMService의 createNewApplication을 호출하고, RM으로 부터 클러스터로부터 최대로 할당받을 수 있는 리소스 정보인 GetNewApplicationResponse를 받는다. 이 정보를 바탕으로 submitApplication을 진행한다.)
-
Application ID, Application Name, Queue Name, Application priority, ContainerLaunchContext 정보가 정해지면, Resource Manager의 Application Manager는 AMLauncher를 통해 RM내부 스캐쥴러를 통해 전달받은 NodeManager에 Application Master를 실행한다.
-
Node Manager는 RM으로 부터 ContainerLaunchContext를 전달받는데, 이 정보를 이용해 AM(Application Master)를 실행한다.
ContainerLaunchContext에는 아래와 같은 정보가 있다.- ContainerId
- Resource: 컨테이너에게 할당된 자원
- User: 컨테이너가 할당된
- Security token: (Security가 On인 경우에만)
- LoadResource: container를 실행시키는데 필요한 binary. (ex jar, shared objects ... )
- Environment Variables
- Commands: 컨테이너 구동에 필요한 명령어
-
정상적으로 Application Master이 실행될 경우 RPC port랑 Tracking UI가 배정되고 Resource Manager에 등록이 된다. 그래야 AM이 resource manager에게 Resource 요청을 할 수 있다. ApplicationMasterProtocol은 ResourceManager와 ApplicationMaster 사이에 필요한 인터페이스로서, AMRMClient, AMRMClientAsync라는 구현체가 있다.
-
AM이 RM으로 부터 요청하여 할당받은 Resource인 container를 node manager에서 실행하여 job을 수행하게 된다.