YARN 은 클러스터의 자원을 모아 두고 요청하는 쪽에 컨테이너 단위로 나눠 주는 계층이다. 직접 계산을 하지 않고, 누가 얼마를 언제 쓸지를 정한다. MapReduce 에 묶여 있던 자원 관리를 떼어낸 것이 YARN 이고, 그 덕분에 MapReduce 가 아닌 엔진도 같은 클러스터를 나눠 쓸 수 있게 됐다.
| 구성 요소 | 역할 |
|---|---|
| ResourceManager | 클러스터 전체의 자원을 보고 스케줄링한다. 노드 상태를 관리한다 |
| NodeManager | 노드마다 하나. 컨테이너를 띄우고 감시하며 자원 사용량을 보고한다 |
| ApplicationMaster | 애플리케이션마다 하나. 자기 작업에 필요한 컨테이너를 요청하고 진행을 관리한다 |
| Container | 실제 작업이 도는 단위. 메모리·CPU 한계가 걸려 있다 |
ApplicationMaster 는 YARN 이 아니라 애플리케이션이 제공한다. 즉 MapReduce 에는 MapReduce 의 AM 이, Spark 에는 Spark 의 AM 이 있다. 작업이 시작되면 YARN 은 먼저 AM 컨테이너를 하나 띄우고, 그다음부터는 AM 이 필요한 컨테이너를 요청한다. 이 구조 덕분에 엔진마다 스케줄링 방식이 달라도 YARN 은 같은 방식으로 다룰 수 있다.
아래는 작업을 실행할 때 YARN 에 컨테이너를 요청하는 것들이다. YARN 이 멈추면 작업이 돌지 않는다.
| 컴포넌트 | 관계 |
|---|---|
| MapReduce | YARN 위에서만 돈다 |
| Apache Tez | YARN 위에서 DAG 를 실행한다 |
| Apache Spark | --master yarn 일 때 의존한다. standalone · Kubernetes 모드면 쓰지 않는다 |
| Apache Flink | YARN 세션·애플리케이션 모드일 때 의존한다. standalone · Kubernetes 모드면 쓰지 않는다 |
| Sqoop | 내부적으로 MapReduce 작업을 만들어 돌린다 |
| 컴포넌트 | 관계 |
|---|---|
| Hive | 엔진에 따라 다르다. Tez · MapReduce · Spark 를 실행 엔진으로 쓰면 그 엔진을 통해 YARN 을 쓴다. HiveServer2 와 메타스토어 자체는 YARN 과 무관하다 |
| Oozie | 워크플로가 띄우는 작업이 YARN 을 쓴다. Oozie 는 launcher 라는 YARN 작업을 통해 대부분의 액션을 실행하므로 사실상 의존한다 |
| Impala | 쓰지 않는다. 자체 데몬(impalad · statestored · catalogd)이 상주하며 직접 실행한다 |
| HBase | 쓰지 않는다. RegionServer 가 상주한다. 다만 HBase 위의 MapReduce 작업은 YARN 을 쓴다 |
| Kafka | 쓰지 않는다. broker 가 상주한다 |
| ZooKeeper | 쓰지 않는다. 오히려 YARN 의 ResourceManager HA 와 상태 저장소로 ZooKeeper 가 쓰인다 |
| HDFS | 쓰지 않는다. YARN 과 나란히 있는 별개 계층이다 |
가르는 기준은 "작업을 실행할 때 컨테이너를 YARN 에 요청하는가" 다. 상주 데몬을 두고 스스로 실행하는 것들(Impala · HBase · Kafka · ZooKeeper)은 YARN 을 쓰지 않는다. 대신 클러스터 자원을 YARN 과 나눠 쓰게 되므로, 같은 노드에 올린다면 YARN 이 내놓는 메모리 총량(yarn.nodemanager.resource.memory-mb)을 그만큼 줄여 잡아야 한다.
Hive 가 헷갈리기 쉽다. HiveQL 이 MapReduce 로 번역되던 시절의 인상 때문인데, 정확히는 Hive 가 YARN 을 직접 부르는 것이 아니라 Hive 가 고른 실행 엔진이 YARN 을 부른다. hive.execution.engine 값에 따라 달라지고, 메타데이터만 읽는 조회는 엔진을 거치지 않으므로 YARN 작업이 생기지 않는다.
YARN · MapReduce · Hive on Tez