용량 스케줄러

용량 스케줄러 (Capacity Scheduler)

여러 조직이 큰 하둡 클러스터를 나눠 쓸 때 "내 SLA를 지키면서도 낭비 없이" 리소스를 나눠주는 게 중요해요. CapacityScheduler는 멀티테넌트가 안전하게 클러스터를 공유하도록 설계된 플로그형 스케줄러예요. 각 조직(큐)에 용량을 보장하면서 남는 자원은 탄력적으로 나눠줘요.

출처: https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/CapacityScheduler.html

CapacityScheduler의 핵심 추상화는 **큐(queue)**예요. 관리자가 클러스터 경제를 반영해 큐를 만들고, 각 큐에 용량(capacity)을 할당해요. **계층형 큐(hierarchical queues)**를 지원해서, 조직의 하위 큐끼리 먼저 여유 리소스를 나눠 갖고 그래도 남으면 다른 큐가 쓰게 돼요. 이를 통해 공유의 예측 가능성을 높여요.

주요 특징은 이렇습니다. **용량 보장(Capacity Guarantees)**으로 각 큐는 일정 비율의 용량을 확보하고 그 안의 모든 앱이 그 용량을 쓸 수 있어요. **보안(Security)**은 큐마다 엄격한 ACL로 사용자·시스템 관리자 역할을 구분하고 남의 앱을 보거나 수정하지 못하게 막아요. **탄력성(Elasticity)**은 여유 리소스를 큐를 넘어 다른 큐에 할당하고, 나중에 용량 이하로 도는 큐가 요청하면 그 리소스를 되돌려줘요(선점 preemption 포함). **멀티테넌시(Multi-tenancy)**는 단일 앱·사용자·큐가 클러스터를 독점하지 못하게 하는 제한들을 제공해요.

운영성(Operability)도 강점이에요. 큐 정의와 용량·ACL 같은 속성을 런타임에(동적) 변경할 수 있어요. STOPPED 상태의 큐는 기존 앱을 끝까지 돌리되(drain) 새 앱 제출을 막아요. 다만 큐를 삭제하려면 먼저 멈추고 대기·실행 중인 앱이 없어야 해요. **절대 리소스 구성(Absolute Resource Configuration)**으로 퍼센트 대신 절대 용량을 지정할 수도 있어요.

ResourceManager가 CapacityScheduler를 쓰도록 하려면 conf/yarn-site.xml에서 yarn.resourcemanager.scheduler.classorg.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler로 설정해요. 설정 파일은 etc/hadoop/capacity-scheduler.xml이에요.

큐는 미리 정의된 root 큐의 자식으로 만들어져요. yarn.scheduler.capacity.root.queues에 콤마로 구분한 자식 큐 목록을 넣고, 계층은 **큐 경로(queue path)**로 표현하는데 root에서 시작해 .(점)을 구분자로 사용해요. 예를 들어 yarn.scheduler.capacity.root.a.queuesa1,a2를 넣으면 root 아래 a 아래 a1,a2가 생겨요. 각 큐의 용량은 yarn.scheduler.capacity.<queue-path>.capacity로 지정하고, 각 레벨에서 모든 큐의 합은 100이어야 해요. 최대 용량 제한은 yarn.scheduler.capacity.<queue-path>.maximum-capacity로 정하며 -1이면 100%예요.

큐 설정을 파일로 바꾸려면 conf/capacity-scheduler.xml을 수정한 뒤 yarn rmadmin -refreshQueues를 실행해요. API로 변경하려면 yarn.scheduler.configuration.store.class 백킹 스토어를 활성화해야 하고, 이 경우 yarn rmadmin -refreshQueues는 비활성화돼요(이 기능은 알파 단계예요). 관리 ACL 정책은 yarn.scheduler.configuration.mutation.acl-policy.class로 설정해요.

더 알아보기

  • YARN Commands Reference의 schedulerconf로 명령줄 설정 변경하기
  • ResourceManager REST API로 큐 설정 변경하기