YARN 노드의 우아한 제외

YARN 노드의 우아한 제외 (Graceful Decommission of YARN Nodes)

실행 중인 애플리케이션에 미치는 영향을 최소화하면서 YARN NodeManager를 제외(decommission)하는 우아한 제외(Graceful Decommission) 메커니즘을 설명하는 문서예요. 기능, decommission 이벤트 처리, 노드 상태 추적, 노드별 타임아웃, 구성을 다룹니다.

출처: 문서

본문

개요 (Overview)

YARN은 매우 쉽게 확장할 수 있습니다. 새 NodeManager가 구성된 ResourceManager에 합류해 작업을 실행할 수 있어요. 하지만 완전한 탄력성을 얻으려면 기존 노드를 제거하고 클러스터를 축소하는 데 도움을 주는 제외 프로세스가 필요합니다.

YARN 노드는 NORMAL 또는 GRACEFUL로 제외될 수 있어요.

**일반 제외(Normal Decommission)**는 즉시 종료를 의미합니다.

**우아한 제외(Graceful Decommission)**는 실행 중인 애플리케이션에 미치는 영향을 최소화하면서 NM을 제외하는 메커니즘입니다. 노드가 DECOMMISSIONING 상태가 되면 RM은 그 위에 새 컨테이너를 스케줄하지 않고, 실행 중인 컨테이너와 애플리케이션이 완료될 때까지(또는 제외 타임아웃을 초과할 때까지) 기다린 뒤 노드를 DECOMMISSIONED로 전환합니다.

빠른 시작 (Quick start)

일반 제외를 하려면:

  1. YARN 클러스터를 시작합니다(NodeManagers와 ResourceManager 포함).
  2. yarn 작업을 시작합니다(예: yarn jar...).
  3. yarn-site.xml에 yarn.resourcemanager.nodes.exclude-path 속성을 추가합니다(참고: ResourceManager를 재시작할 필요 없음).
  4. 한 줄에 선택한 NodeManager의 이름이 담긴 텍스트 파일을 만듭니다(위치가 이전 단계에서 정의됨).
  5. ./bin/yarn rmadmin -refreshNodes를 호출합니다.
  6. 결과: nodemanager가 즉시 제외됩니다.

다음 절에서는 더 자세한 사용법(예: 타임아웃을 사용한 우아한 제외)을 다룹니다.

기능 (Features)

exclude/include 목록 기반 제외/복귀 트리거

yarn rmadmin -refreshNodes [-g [timeout in seconds] -client|server]는 NodesListManager에 include·exclude 호스트 변경을 감지하고 처리하도록 알립니다. NodesListManager는 yarn-site.xml의 yarn.resourcemanager.nodes.exclude-path 구성이 지정하는 exclude 파일에서 제외 호스트를 로드합니다. (참고: exclude-path 변경 시 RM을 재시작할 필요가 없습니다. 이 구성은 매 refreshNodes 명령마다 다시 읽기 때문이에요.)

파일 형식은 파일 확장자에 따라 일반 텍스트 또는 XML일 수 있습니다. XML 형식만 우아한 제외의 노드별 타임아웃을 지원합니다.

NodesListManager는 리소스 매니저의 RMNode 상태와 exclude 목록을 검사·비교하고 다음 규칙에 따라 필요한 조치를 적용합니다.

  • 더 이상 제외되지 않는 DECOMMISSIONED 또는 DECOMMISSIONING 노드를 복귀(recommission)합니다.
  • 아직 DECOMMISSIONED도 DECOMMISSIONING도 아닌 제외 노드를 우아하게 제외합니다.
  • -g 플래그를 지정하지 않으면 아직 DECOMMISSIONED가 아닌 제외 노드를 즉시 제외합니다.

이에 따라 RECOMMISSION, GRACEFUL_DECOMMISSION 또는 DECOMMISSION RMNodeEvent가 RMNode로 보내집니다.

노드별 제외 타임아웃 지원

단일 또는 여러 refreshNodes 요청을 통해 서로 다른 타임아웃으로 노드를 유연하게 우아하게 제외하기 위해, HostsFileReader는 exclude 호스트 파일에서 각 호스트명(또는 ip) 뒤의 선택적 타임아웃 값을 지원합니다.

특정 호스트에 사용할 유효 제외 타임아웃은 다음 우선순위에 따라 결정됩니다.

서버 측 타임아웃의 경우:

  1. exclude 호스트 파일에 지정된 특정 호스트의 타임아웃을 사용합니다.
  2. yarn rmadmin -refreshNodes -g [timeout in seconds] -server|client에 지정된 타임아웃을 사용합니다.
  3. "yarn.resourcemanager.nodemanager-graceful-decommission-timeout-secs" 구성이 지정하는 기본 타임아웃을 사용합니다.

클라이언트 측 타임아웃의 경우(아래 참고):

  1. -g 플래그가 정의한 명령줄 파라미터만 사용됩니다.

NodesListManager는 사용할 유효 타임아웃을 결정해 개별 RMNode에 설정합니다. 타임아웃은 yarn rmadmin -refreshNodes -g [timeout in seconds] 명령으로 동적으로 조정할 수도 있어요. NodesListManager는 사용할 유효 타임아웃을 해석하고 새 타임아웃으로 RMNode를 필요에 따라 갱신합니다. 타임아웃 변경은 진행 중인 제외를 리셋하지 않고, 노드가 제외 타임아웃에 도달했는지 평가에만 영향을 줍니다.

다음은 XML 형식의 샘플 excludes 파일입니다.

<?xml version="1.0"?>
<hosts>
  <host><name>host1</name></host>
  <host><name>host2</name><timeout>123</timeout></host>
  <host><name>host3</name><timeout>-1</timeout></host>
  <host><name>host4, host5,host6</name><timeout>1800</timeout></host>
</hosts>

exclude 파일의 확장자가 xml이 아니면 타임아웃 지원 없이 표준 한 줄당 한 호스트 형식이 사용됩니다.

host1
host2
host3

참고: 미래에는 타임아웃을 지원하는 더 많은 파일 형식이 계획되어 있습니다. 관심이 있으면 YARN-5536을 따라가세요.

중요한 점: 타임아웃은 영속되지 않습니다. RM 재시작/페일오버가 발생하면 노드는 즉시 제외됩니다. (이 동작의 변경은 YARN-5464를 따르세요.)

클라이언트 또는 서버 측 타임아웃

우아한 제외의 타임아웃은 서버 또는 클라이언트 측에서 추적될 수 있습니다. -client|server는 타임아웃 추적을 클라이언트가 처리할지 ResourceManager가 처리할지 나타냅니다. 클라이언트 측 추적은 블로킹이고, 서버 측 추적은 블로킹이 아닙니다.

RMNode의 decommission 이벤트 처리

GRACEFUL_DECOMMISSION 이벤트를 받으면 RMNode는 지정된 제외 타임아웃을 저장하고, 우아한 제외 메트릭을 갱신하며 원래 총 용량을 보존하고 DECOMMISSIONING 상태로 전환합니다.

DECOMMISSIONING RMNode의 자원은 동적으로 주기적으로 갱신되어, 사용 가능한 자원이 없어 스케줄러가 그 위에 새 컨테이너를 스케줄하지 않도록 합니다.

제외 노드 상태의 자동·비동기 추적

DecommissioningNodeWatcher는 클라이언트/관리자가 우아한 제외 요청을 한 뒤 DECOMMISSIONING 노드 상태를 자동·비동기적으로 추적하는 YARN 구성 요소입니다. NM은 주기적으로 자신의 최신 컨테이너 상태로 RM 하트비트를 보냅니다. DecommissioningNodeWatcher는 모든 DECOMMISSIONING 노드의 하트비트 갱신을 추적해, 노드의 모든 실행 컨테이너가 완료된 뒤 언제 DECOMMISSIONED 상태로 전환되고 NodeManager가 종료하도록 지시받을지 결정합니다.

MR 애플리케이션에서 노드는 모든 컨테이너를 완료한 뒤에도 애플리케이션 기간 동안 리듀서를 위해 map 출력 데이터를 계속 서빙할 수 있어요. YARN 우아한 제외 메커니즘은 관련 애플리케이션이 모두 완료될 때까지 이런 DECOMMISSIONING 노드를 유지합니다. 하지만 장기 실행 애플리케이션 시나리오에서는 수많은 "유휴" 노드가 오랫동안 남아 있을 수 있어 바람직하지 않을 수 있어요. DecommissioningNodeWatcher는 타임아웃으로 이런 우려를 균형 잡습니다. DECOMMISSIONING 노드는 실행 중인 컨테이너나 애플리케이션과 관계없이 제외 타임아웃보다 늦지 않게 DECOMMISSIONED 됩니다. 실행 컨테이너가 더 일찍 끝나면 제외 타임아웃까지 애플리케이션 완료를 계속 기다립니다. 제외 타임아웃에 도달하면 노드는 무조건 제외됩니다. 노드는 비활성화되고 소유 작업은 필요에 따라 재스케줄됩니다.

모든 제외 노드의 상태는 리소스 매니저 로그에 주기적으로(매 20초) 기록됩니다. 제외 노드의 하위 상태는 다음과 같습니다.

  • NONE — 노드가 DECOMMISSIONING 상태가 아님.
  • WAIT_CONTAINER — 실행 컨테이너 완료 대기.
  • WAIT_APP — 실행 애플리케이션 완료 대기(모든 컨테이너 완료 후).
  • TIMEOUT — 컨테이너나 애플리케이션 완료를 기다리는 타임아웃.
  • READY — 기다릴 게 없어 제외 준비 완료.
  • DECOMMISSIONED — 노드가 이미 제외됨.

구성 (Configuration)

속성 값
yarn.resourcemanager.nodemanager-graceful-decommission-timeout-secs YARN 노드 우아한 제외의 타임아웃(초). DECOMMISSIONING 노드를 DECOMMISSIONED로 전환하기 전에 실행 컨테이너와 애플리케이션이 완료되기를 기다리는 최대 시간. 기본값 3600초. 음수 값(예: -1)은 무한 타임아웃으로 처리.
yarn.resourcemanager.decommissioning-nodes-watcher.poll-interval-secs DecommissioningNodesWatcher 내부 폴 타이머 작업의 주기(초)로, 정기 하트비트가 없는 DECOMMISSIONING 노드를 식별·처리. 기본값 20초.
yarn.resourcemanager.nodes.exclude-path 제외할 노드가 담긴 파일 경로.
yarn.resourcemanager.nodes.include-path 포함할 노드가 담긴 파일 경로.

더 알아보기 (Learn more)