본문 바로가기

YARN

0. YARN 이란?

YARN이란?

: Yet Another Resource Negotiator

Hadoop Docs : to split up the functionalities of resource management and job scheduling/monitoring into separate daemons

클라우데라 : resource management layer for the Apache Hadoop ecosystem

호튼웍스 : YARN is the prerequisite for Enterprise Hadoop, providing resource management and a central platform to deliver consistent operations, security, and data governance tools across Hadoop clusters



위 설명에서 공통적으로 나오는 단어가 Resource Management 라는 용어인데 이게 YARN 의 핵심기능이자 YARN 을 한 단어로 표현해주는 것 같다. 각 어플리케이션에 필요한 리소스를 할당하고 모니터링 해준다. 



또한 YARN 이 보통 자랑하는게 Hadoop 1.x 버전에서는 Hadoop MR만 또는 MR API 를 사용한 Application 만 실행할수 있었지만 YARN 은 MR 뿐 아니라 다양한 Application 을 지원해준다. 최근 트렌드인 Spark 도 YARN 위에서 돌릴수 있으니 말이다.



Hadoop이 2.0으로 올라오면서 크게 두가지 컴포넌트로 구성되었다. 하나는 파일을 분산 환경에 에서 쉽게 관리할수 있도록 도와주는 분산 파일 시스템인 HDFS(Hadoop Distributed File System)와 잡(Job)들의 분산 스케줄링을 관리하는 YARN(Yet Another Resource Negotiator) 이다. 이글에서는 HDFS 에 대한 내용은 최대한 배제하고 설명할 것이다.




Master / Worker 클러스터 





Hadoop 에는 2가지 컨셉의 호스트가 존재한다. Master 호스트와 Worker 호스트 이다. 마스터는 클라이언트로부터 잡을 요청받고 결과를 전달해주는 communication point 로서의 역할을 하는 호스트이다. Worker 호스트들은 Master 호스트로부터 working 해야할 내용을들 전달받아 처리하는 역할을 한다.



YARN 클러스터 (Master/ResourceManager, Worker/NodeManager)



  •  Resource Manager : Master 호스트에서 뜨는 Daemon 으로서 client 와 통신하는 역할을 한다. 그리고 클러스터에 있는 Worker 호스트들의 Resource 를 트래킹하여 Job 실행에 필요한 Node Manager 들을 컨트롤 하는 역할을 한다.

  •  Node Manager : Worker 호스트에 존재하는 Daemon 으로서 실제로 job 을 처리하고 결과를 전달해주는 역할을 한다.



Yarn 은 vcore 와 RAM 메모리를 중점적으로 트래킹 하는데,( 호튼웍스 블로그에 보면 추후에 Disk, Network I/O 상태, GPU etc... 체크할것 같다고 함 )  위 그림에서와 같이 Worker 가 각각 1대당 vcores 를 64개, RAM 을 128GB 를 가지고, 이러한 Worker 호스트가 100대 존재한다면 각각의 Node Manager 를 통해 Resource Manager Daemon 은 현재 이 클러스터에 vcore 6400개 RAM 12800 GB 를 소유 하고 있음을 알 수 있게 된다.

 지금 위 그림은 클러스터 내에서 어떠한 job 도 실행되지 않는 깨끗한 상태이지만 실제로 job 이 돌아가게 되면 Resource Manager 는 현재 Resource 가 남는 Worker 를 찾아 job 을 할당해 준다.



Container



 Container 라고 하는것은 YARN 에서 쓰는 용어인데, 리소스를 점유하는 하나의 단위라고 생각하면 된다. job 의 요청이 여러개의 Map/Reduce Task 로 분리되어 Node Manager 에게 할당되면 Node Manager 는 그 요청을 처리하기 위해 하나의 Container 를 실행하게 된다. 이 Container 는 우측에서 보는거와 같이 CPU, RAM 등의 리소스를 점유하여 task 를 처리하게 된다. 뒤에가서 각각의 worker host 에서 container 들을 어떻게 스케줄링하여 사용하는지 자세히 알아보도록 하겠다.


여기서 잠깐!(용어 설명)

Task 란 Application 이 요청하는 하나의 job 을 실행하기 위해 이 job 을 여러개로 쪼갠것을 의미한다. Task 에는 Map Task와 Reduce Task 가 존재하고 이 Task 가 모두 실행되면 하나의  job 이 끝났다고 할 수 있다.




Running Process/ApplicationMaster

그럼 이제 YARN 클러스터에 job 을 요청한 경우(= 클러스터에서 Process 를 Running 하는 ) 어떠한 방식으로 실행이 되는지 알아보도록 하자.



1. Client 가 Application 을 실행하고 클러스터의 Resource Manager( 뒤에서는 너무 기니까 RM 이라고 부르겠다 +_+) 에게 이를 알려준다.





2. RM 은 Worker 호스트중에 하나를 골라 Container 를 생성한다. 그리고 그 Container 가 바로 Application Master ( 이건 AM 이라고 부르겟다 +_+) 이다. 즉, 아래 그림에서 최초에 생성된 Container 안에서 AM 이 실행된다.



3. AM 은 task 를 실행할 컨테이너를 RM 에게 요청하게 된다. 그럼 RM 은 유휴한 자원을 소유한 Work 호스트의 Node Manager 를 통해 task 를 실행할 Container 를 생성하게 되고 task 를 실행하는 Container 는 task 의 상태( status) 를 AM 에게 알려준다.




4. 모든 task가 종료되면 AM도 종료되고 클러스터에 할당된 컨테이너의 자원도 모두 de-allocated 된다. 그리고 Application client 도 종료된다.




Ideal YARN!!

클러스터의 모든 자원을 사용한다.


But Realistic YARN Allocation....

 모두가 예상하게도 그렇지 못하다가 당연한 결론인데, YARN 만 돌리는게 아니기 때문이라는거다. OS 도 일단 깔려 있어야 하고( 당연한거 아님? ), 다른 Components 도 깔려 있어야 하구... 또 HDFS Cluster 도 YARN Cluster 에 같이 구성되어야 ( Required!! 필수!! ) 한다.
 그래서 어차피 깔아야 되는거면 최대한 좋은 퍼포먼스가 나도록 깔아야 하는데, 그래서 아래와 같이 제안한다. 

HDFS DataNodes and the YARN NodeManagers run on the same set of Worker nodes in the cluster
HDFS 에서의 Data Node 와 YARN 에서느 Node Manager 는 같은 Worker 노드(호스트) 에서 돌도록 구성해라. YARN 자체적으로도 Basick Resource 를 필요로 한다. 아래그림으로 따지자면 Basic Resource 가 어느정도 필요한데, 해당 서버에 YARN 하나를 위에 HDD 를 설치하기에는 너무 아깝다는 것이다. 그래서 Storage 를 많이 필요로 하는 HDFS 와 같이 깔면 리소스의 낭비를 줄일 수 있다는 것이다.

또한 HDFS / YARN 클러스터의 랙 구성시 Network I/O 를 최대한 많이 타지 않도록 구성하는것이 중요하다고 한다.



근데 그래서 어쨋든 YARN 이 설치된 호스트에서 모든 자원을 YARN 을 위해 쓸수는 없어서 YARN 에서 사용할 Resource( 위에서도 언급했다싶이 vcore 와 memory 를 지정 ) 를 설정할 수 있는데
아래 파일에서 2개의 property 를 수정해서 설정할 수 있다.

yarn-default.xml

yarn.nodemanager.resource.memory-mb = 90000
yarn.nodemanager.resource.vcores = 60

위와 같이 설정한 경우 Hadoop Cluster UI 에서 아래와 같이 확인할 수 있다. 아! Host 의 숫자는 50대라고 가정했다. +_+

memory = 90GB * 50 = 4500GB
vcores = 60 * 50 = 3000



결론

그니까 YARN 은 결국 Application 의 job 을 Distributed 한 환경에서 처리할 수 있도록 도와주는 클러스터링 서비스이다. RM, AM, NM 이 YARN 에서의 주요 컴포넌트이고 하나의 잡을 처리하기 위해 여러개의 Task 를 나누고, 이를 처리하기 위한 Container 라는 개념이 존재하는 것이다.