예약 시스템
예약 시스템 (Reservation System)
이 문서는 YARN ReservationSystem에 대한 간략한 개요를 제공합니다.
출처: 문서
본문
목적 (Purpose)
YARN의 ReservationSystem은 사용자가 시간에 걸쳐(그리고 미리) 리소스를 예약할 수 있게 해주어, 중요한 운영(production) 작업이 매우 예측 가능하게 실행되도록 보장합니다.
개요 (Overview)
YARN의 ReservationSystem은 사용자가 시간에 걸쳐(그리고 미리) 리소스를 예약할 수 있게 해주어, 중요한 운영 작업이 매우 예측 가능하게 실행되도록 보장합니다. ReservationSystem은 신중한 승인 제어(admission control)를 수행하고 (클러스터 크기의 %가 아닌) 절대적인 리소스 양에 대한 보장을 제공합니다. 예약은 malleable이거나 gang 의미론을 가질 수 있으며, 시간에 따라 변하는 리소스 요구사항을 가질 수 있습니다. ReservationSystem은 YARN ResourceManager의 컴포넌트입니다.
예약의 흐름 (Flow of a Reservation)
전형적인 예약은 다음과 같이 진행됩니다:
- 단계 0 사용자(또는 이를 대신하는 자동화 도구)가 예약 생성 요청을 제출하고, ReservationId를 포함한 응답을 받습니다.
- 단계 1 사용자(또는 이를 대신하는 자동화 도구)가 Reservation Definition Language(RDL)로 지정된 예약 요청과 이전 단계에서 받은 ReservationId를 제출합니다. 이는 시간에 따른 리소스에 대한 사용자 요구(예: 리소스 스카이라인)와 시간 제약(예: 데드라인)을 설명합니다. 이는 일반적인 Client-to-RM 프로토콜을 통한 프로그래밍 방식 또는 RM의 REST API를 통해서도 수행할 수 있습니다. 같은 ReservationId로 제출되었고 RDL이 같으면 새 예약이 생성되지 않고 요청은 성공합니다. RDL이 다르면 예약은 거부되고 요청은 실패합니다.
- 단계 2 ReservationSystem은 ReservationAgent(그림의 GREE)를 활용해, 현재 받아들여진 모든 예약과 시스템의 가용 리소스를 추적하는 데이터 구조인 Plan에서 예약에 대한 가능한 할당을 찾습니다.
- 단계 3 SharingPolicy는 받아들여질 예약에 대한 불변식(invariants)을 강제하는 방법을 제공하며, 잠재적으로 예약을 거부할 수 있습니다. 예를 들어 CapacityOvertimePolicy는 사용자가 자신의 모든 예약에서 요청할 수 있는 순간 최대 용량과 일정 기간 동안의 리소스 적분(resource integral)에 대한 제한을 모두 강제할 수 있습니다. 예: 사용자는 클러스터 용량의 최대 50%를 순간적으로 예약할 수 있지만, 어떤 24시간 기간에서든 평균 10%를 초과할 수 없습니다.
- 단계 4 유효성 검사가 성공하면 ReservationSystem은 사용자에게 ReservationId를 반환합니다(항공권처럼 생각하세요).
- 단계 5 시간이 되면 PlanFollower라는 새 컴포넌트가 큐를 동적으로 생성/조정/파괴하여 plan의 상태를 스케줄러에 게시합니다.
- 단계 6 사용자는 ApplicationSubmissionContext에 ReservationId를 포함하기만 하면 예약 가능한 큐에 하나(또는 여러 개)의 작업을 제출할 수 있습니다.
- 단계 7 그러면 Scheduler는 리소스 예약이 존중되도록 보장하기 위해 생성된 특수 큐에서 컨테이너를 제공합니다. 예약의 한도 내에서 사용자는 리소스에 대한 보장된 접근을 가지며, 그 이상에서는 리소스 공유가 표준 Capacity/Fairness 공유로 진행됩니다.
- 단계 8 시스템은 클러스터 용량 감소에 적응하는 메커니즘을 포함합니다. 이는 가능하면 예약을 "이동"하여 재계획하거나, 이전에 수락된 예약 중 가장 작은 양을 거부하여(다른 예약이 전체 양을 받도록 보장) 구성됩니다.
예약 시스템 구성 (Configuring the Reservation System)
ReservationSystem 구성은 간단합니다. 현재 CapacityScheduler와 FairScheduler 모두에서 예약 지원을 추가했습니다. capacity-scheduler.xml 또는 fair-scheduler.xml에서 어떤 리프 큐든 "예약"에 사용 가능하다고 표시할 수 있습니다(자세한 내용은 CapacityScheduler와 FairScheduler를 참조하세요). 그러면 그 큐 내의 capacity/fair 몫을 예약을 만드는 데 사용할 수 있습니다. 예약 없이도 예약 가능한 큐에 작업을 계속 제출할 수 있으며, 이 경우 활성 예약 내에서 실행되는 작업이 남긴 남은 용량으로 best-effort 모드로 실행됩니다.
더 알아보기 (Learn more)
- 원문: 문서