YARN 의 메모리 설정은 노드가 내놓는 총량, 스케줄러가 한 번에 떼어 주는 단위, 애플리케이션이 요구하는 양의 세 층으로 나뉜다. 어느 층에서 막혔는지에 따라 고칠 곳이 다르다.
| 층 | 속성 | 뜻 |
|---|---|---|
| 노드 | yarn.nodemanager.resource.memory-mb |
그 노드가 컨테이너에 내놓는 총 메모리 |
| 스케줄러 | yarn.scheduler.minimum-allocation-mb |
컨테이너 하나에 떼어 주는 최소 단위 |
| 스케줄러 | yarn.scheduler.maximum-allocation-mb |
컨테이너 하나가 받을 수 있는 최대 |
| 애플리케이션 | yarn.app.mapreduce.am.resource.mb |
MapReduce ApplicationMaster 컨테이너 크기 |
| 애플리케이션 | mapreduce.map.memory.mb · mapreduce.reduce.memory.mb |
map · reduce 태스크 컨테이너 크기 |
yarn.scheduler.minimum-allocation-mb 는 "최소 요청량" 이면서 동시에 할당 단위다. 요청한 값은 이 단위의 배수로 올림된다. 단위가 1024MB 인데 1500MB 를 요청하면 실제로는 2048MB 를 받는다. 단위를 크게 잡으면 작은 작업도 큰 컨테이너를 차지해 낭비가 생기고, 너무 작게 잡으면 컨테이너 수가 늘어 관리 부담이 커진다. 1024MB 또는 2048MB 가 흔한 값이다.
yarn.scheduler.maximum-allocation-mb 보다 큰 값을 요청하면 애플리케이션이 바로 거부된다. Tez 나 Spark 에서 컨테이너 크기를 올렸는데 제출 단계에서 실패한다면 이 값을 먼저 본다. 이 값은 yarn.nodemanager.resource.memory-mb 를 넘겨 잡아도 의미가 없다. 한 컨테이너는 노드 하나 안에 들어가야 하기 때문이다.
yarn.app.mapreduce.am.resource.mb 는 MapReduce 작업의 ApplicationMaster 가 쓸 컨테이너 크기다. AM 은 태스크를 실행하지 않고 스케줄링과 진행 상황 관리만 하므로 보통 크게 잡을 필요가 없다. 다만 태스크 수가 매우 많은 작업에서는 AM 이 관리해야 할 상태가 늘어 메모리가 모자랄 수 있다. 작업이 중간에 AM 쪽에서 죽는다면 이 값을 올린다.
JVM 힙은 컨테이너 크기와 별개로 지정한다. 힙을 컨테이너 크기와 같게 잡으면 JVM 자체가 쓰는 비힙 영역 때문에 컨테이너 한계를 넘어 NodeManager 에 죽임을 당한다. 힙은 컨테이너 크기의 70~80% 정도로 둔다.
<property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.app.mapreduce.am.command-opts</name>
<value>-Xmx1536m</value>
</property>
map · reduce 태스크도 같은 관계다.
<property>
<name>mapreduce.map.memory.mb</name>
<value>4096</value>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx3276m</value>
</property>
yarn 명령 자체의 힙은 YARN 설정 파일이 아니라 환경변수로 정한다. yarn.client.heap 같은 속성은 없다.
export YARN_CLIENT_OPTS="-Xmx2g"
yarn application -list
HADOOP_CLIENT_OPTS 도 같은 역할을 하며, 명령별 변수(YARN_OPTS 등)는 배포판과 버전에 따라 이름이 다르므로 실행 시 경고 메시지를 확인한다. 예를 들어 최근 배포에서는 YARN_OPTS 가 HADOOP_OPTS 로 대체됐다는 경고가 나온다.
설정이 실제로 반영됐는지는 실행 중인 애플리케이션의 컨테이너 크기로 확인한다.
yarn node -list -showDetails
yarn application -status <application_id>
ResourceManager 웹 UI 의 스케줄러 화면에서 노드별 가용 메모리와 컨테이너 수를 함께 본다. 노드가 내놓는 총량은 물리 메모리 전부가 아니라 OS 와 다른 데몬 몫을 뺀 값으로 잡는다.