Published on

Hadoop의 OS 'Yarn'이란 무엇인가?

Authors

YARN의 탄생 배경.

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

YARN architecture

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의 구성 요소

  1. ResourceManager (RM): 클러스터 수준의 자원 관리: 전체 Hadoop 클러스터의 자원을 중앙에서 관리합니다. Scheduler: 애플리케이션에 필요한 자원을 할당하는 스케줄러 역할을 합니다. 이 스캐쥴러는 pluggable 하여 운영자가 policy plugin을 선택할 수 있고, 많이 사용되는 것은 capacity, fair, SLA scheduler가 있다. Applicationd의 상태는 모니터링 하지 않고, 어플리케이션의 장애나 H/W failure에 대한 restart와 같은 작업도 진행하지 않는다. 리소스 요구사항을 기반으로 한 기능만 수행한다. Application Manager: 애플리케이션의 라이프사이클을 관리하며, 애플리케이션 제출, 실행, 종료 등의 작업을 처리합니다. Job의 제출을 받아주고, Application Master가 실행될 첫번 째 컨테이너를 선정하고, 이후 실패(장애)에 대해 Application Master container를 재시작 하는 역할을 한다.

  2. NodeManager (NM): 각 노드에서 실행되며 해당 노드의 자원 사용량과 상태를 모니터링합니다. ResourceManager의 지시에 따라 컨테이너를 시작하거나 종료합니다.

  3. ApplicationMaster (AM): 각 애플리케이션마다 하나씩 인스턴스화되며, 애플리케이션의 실행을 관리합니다. ResourceManager에 자원 요청을 하고, NodeManager에게 실제 작업을 실행시킵니다. 애플리케이션의 진행 상태를 모니터링하고 필요시 리소스를 조정합니다.

  4. 컨테이너 (Container): 애플리케이션 실행에 필요한 자원(CPU=v-core, Memory=v-mem 등)의 묶음입니다. ResourceManager에 의해 할당되며, NodeManager에 의해 관리됩니다.

YARN과 HDFS의 관계는 의존적인가?

거의 대부분의 YARN은 HDFS 위에서 동작하고, Hadoop binary에도 포함되어있기 때문에 dependency가 있을 것이라고 생각할 수 있지만, 이는 오해이다. YARN은 HDFS와 가장 궁합이 잘 맞는 도구인 것은 분명하지만, HDFS는 storage 영역을 담당하고, YARN은 리소스 관리를 담당하는 독립적인 컴포넌트이다.

YARN Job 제출 및 실행 흐름.

yarn-job workflow
  1. Client가 Resource Manager에게 Job 제출. (이 때 Client는 Application ID를 발급받아야하는데, ClientRMService의 createNewApplication을 호출하고, RM으로 부터 클러스터로부터 최대로 할당받을 수 있는 리소스 정보인 GetNewApplicationResponse를 받는다. 이 정보를 바탕으로 submitApplication을 진행한다.)

  2. Application ID, Application Name, Queue Name, Application priority, ContainerLaunchContext 정보가 정해지면, Resource Manager의 Application Manager는 AMLauncher를 통해 RM내부 스캐쥴러를 통해 전달받은 NodeManager에 Application Master를 실행한다.

  3. 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: 컨테이너 구동에 필요한 명령어
  4. 정상적으로 Application Master이 실행될 경우 RPC port랑 Tracking UI가 배정되고 Resource Manager에 등록이 된다. 그래야 AM이 resource manager에게 Resource 요청을 할 수 있다. ApplicationMasterProtocol은 ResourceManager와 ApplicationMaster 사이에 필요한 인터페이스로서, AMRMClient, AMRMClientAsync라는 구현체가 있다.

  5. AM이 RM으로 부터 요청하여 할당받은 Resource인 container를 node manager에서 실행하여 job을 수행하게 된다.