Apache Hadoop — HDFS 와 YARN 을 한 파드에 세우고 운영한다 · YARN 컨테이너와 대기열 · 实验
2Gi 파드에 맞춰 컨테이너 크기를 잡고 대기열을 나눈다
목표
ResourceManager 의 REST API 로 이 클러스터가 내줄 수 있는 자원을 확인하고, 그보다 큰 컨테이너를 달라는 잡이 어떻게 끝나는지 본다. Capacity Scheduler 에 etl·adhoc 대기열을 만들어 잡을 보내고, 없는 대기열이 거절되는 것과 끝난 잡의 로그를 모아 읽는 법까지 다룬다.
왜 중요한가
YARN 은 클러스터의 메모리와 코어를 컨테이너 단위로 나눠 주는 자원 관리자다. NodeManager 는 자기가 내줄 수 있는 몫(yarn.nodemanager.resource.memory-mb)을 알리고, ResourceManager 의 스케줄러는 요청을 최소 할당 단위로 올려 잡고 최대 할당보다 크면 거절한다. 맵리듀스든 Spark 든 YARN 위에서 도는 것은 모두 이 규칙을 따른다.
운영에서 "잡이 ACCEPTED 에서 안 움직여요" 와 "잡이 바로 죽어요" 는 대개 이 숫자들의 문제다. 컨테이너 크기가 노드 몫보다 크면 영원히 자리가 나지 않고, 최대 할당보다 크면 곧바로 거절된다. 이 파드는 메모리가 2Gi 라 노드 몫을 1024MB 로 잡아 두었다 — 숫자가 작아서 규칙이 더 잘 보인다.
대기열은 한 클러스터를 여러 팀이 나눠 쓰는 방법이다. Capacity Scheduler 는 대기열마다 보장 몫(capacity)과 빌려 쓸 수 있는 상한(maximum-capacity)을 둔다. 같은 부모 아래 보장 몫의 합은 100 이어야 하고, 설정 파일을 고친 뒤 refreshQueues 로 다시 읽힌다. 끝난 컨테이너의 로그는 NodeManager 가 HDFS 로 모아 두므로(로그 모으기), 파드가 사라진 뒤에도 yarn logs 로 읽을 수 있다.
단계
1. lab-hadoop start yarn 으로 YARN 을 켜고 curl -s http://localhost:8088/ws/v1/cluster/metrics 응답을 /root/hdp/yarn/metrics.json 에 저장하세요.
2. 예제 jar 의 pi 를 -D mapreduce.map.memory.mb=2048 로 돌려 잡이 끝나게 한 뒤, 그 애플리케이션의 yarn application -status <애플리케이션 ID> 출력을 /root/hdp/yarn/toobig.txt 에 저장하세요.
3. /opt/hadoop/etc/hadoop/capacity-scheduler.xml 을 고쳐 root 아래 대기열을 default,etl,adhoc 로, 보장 몫을 20·50·30 으로, adhoc 의 상한을 50 으로 두고 yarn rmadmin -refreshQueues 한 뒤, yarn queue -status etl 출력을 /root/hdp/yarn/etl.txt 에 저장하세요.
4. /data/books/book-1.txt 를 HDFS /user/root/yarn/in/ 에 올리고 wordcount 를 -D mapreduce.job.queuename=etl 로 /user/root/yarn/wc-etl 에 돌리세요.
5. 같은 wordcount 를 없는 대기열 nope 로 제출해 보고(출력 /user/root/yarn/wc-nope) 오류 출력을 /root/hdp/yarn/badqueue.txt 에 저장하세요.
6. curl -s http://localhost:8088/ws/v1/cluster/scheduler 응답을 /root/hdp/yarn/scheduler.json 에 저장하세요.
7. 4단계 잡의 애플리케이션 로그를 yarn logs -applicationId <애플리케이션 ID> 로 모아 /root/hdp/yarn/etl-logs.txt 에 저장하세요.
8. /root/hdp/yarn/report.md 에 ## 컨테이너 크기 ## 대기열 ## 로그 세 절을 쓰세요. 첫 절에 1단계의 totalMB 와 2단계에서 요청한 2048 을 넣으세요.
참고
- 이 파드의 YARN: NodeManager 몫 1024MB·코어 2, 최소 할당 128MB, 최대 할당 1024MB, AM 384MB, 맵·리듀스 256MB(
yarn-site.xml·mapred-site.xml). - 잡 ID
job_<A>_<B>와 애플리케이션 IDapplication_<A>_<B>는 같은 숫자를 씁니다. 끝난 잡의 이력은/tmp/hadoop-yarn/staging/history/done_intermediate/root/에 남습니다. - 이력 서버를 띄우지 않았기 때문에, 실패한 잡은 클라이언트가 최종 상태를 가져오다 연결 오류(10020)로 끝날 수 있습니다. 잡의 진짜 결과는
yarn application -status나 이력 파일에서 보세요. - 흔한 실수: 보장 몫의 합을 100 으로 맞추지 않아 refreshQueues 가 거절되는 것, 대기열 이름에
root.을 붙여 제출하는 것(이름만 씁니다), 애플리케이션이 끝나기 전에yarn logs를 부르는 것. - 공식 문서: [Apache Hadoop YARN](https://hadoop.apache.org/docs/r3.5.0/hadoop-yarn/hadoop-yarn-site/YARN.html) · [Capacity Scheduler](https://hadoop.apache.org/docs/r3.5.0/hadoop-yarn/hadoop-yarn-site/CapacityScheduler.html) · [ResourceManager REST APIs](https://hadoop.apache.org/docs/r3.5.0/hadoop-yarn/hadoop-yarn-site/ResourceManagerRest.html) · [yarn-default.xml](https://hadoop.apache.org/docs/r3.5.0/hadoop-yarn/hadoop-yarn-common/yarn-default.xml)
8个步骤
- 클러스터가 내줄 수 있는 것
- 최대 할당보다 큰 컨테이너
- 대기열 셋 만들기
- etl 대기열로 잡 보내기
- 없는 대기열은 제출에서 거절된다
- 스케줄러가 보는 대기열
- 끝난 잡의 로그 모아 읽기
- 자원의 숫자를 남기기