YARN 노드 레이블

YARN 노드 레이블 (Node Labels)

비슷한 특성을 가진 노드를 그룹화하고 애플리케이션이 어디에서 실행할지 지정할 수 있게 하는 Node Label을 설명하는 문서예요. 기능, 구성(중앙/분산/위임-중앙 집중 매핑), 애플리케이션 지정, 모니터링을 다룹니다.

출처: 문서

본문

개요 (Overview)

노드 레이블은 비슷한 특성을 가진 노드를 그룹화하는 방법이며, 애플리케이션은 실행 위치를 지정할 수 있어요.

현재는 노드 파티션만 지원하며, 다음과 같습니다.

  • 한 노드는 하나의 노드 파티션만 가질 수 있으므로, 클러스터는 노드 파티션에 의해 여러 개의 서로소 하위 클러스터로 분할됩니다. 기본적으로 노드는 DEFAULT 파티션(partition="")에 속해요.
  • 사용자는 각 파티션의 자원 중 각 큐가 얼마나 사용할 수 있는지 구성해야 합니다. 자세한 내용은 다음 절을 참고하세요.
  • 노드 파티션에는 두 종류가 있습니다.
    • Exclusive(전용): 컨테이너는 정확히 일치하는 노드 파티션을 가진 노드에 할당됩니다(예: partition="x" 요청은 partition="x" 노드에, DEFAULT 파티션 요청은 DEFAULT 파티션 노드에 할당).
    • Non-exclusive(비전용): 파티션이 비전용이면 DEFAULT 파티션을 요청하는 컨테이너에 유휴 자원을 공유합니다.

사용자는 각 큐가 접근할 수 있는 노드 레이블 집합을 지정할 수 있고, 한 애플리케이션은 그 애플리케이션을 포함하는 큐가 접근할 수 있는 노드 레이블의 부분집합만 사용할 수 있어요.

기능 (Features)

Node Labels는 현재 다음 기능을 지원합니다.

  • 파티션 클러스터 — 각 노드에 레이블 하나를 할당할 수 있어 클러스터가 여러 개의 작은 서로소 파티션으로 나뉩니다.
  • 큐 위의 노드 레이블 ACL — 각 큐에 접근 가능한 노드 레이블을 설정해 일부 노드만 특정 큐가 접근하게 할 수 있습니다.
  • 큐가 접근할 수 있는 파티션 자원의 백분율 지정 — 큐 A가 label=hbase 노드의 자원 30%에 접근할 수 있게 하는 등 백분율을 설정할 수 있습니다. 이런 백분율 설정은 기존 리소스 매니저와 일관됩니다.
  • 리소스 요청에 필수 노드 레이블 지정 — 노드가 같은 레이블을 가질 때만 할당됩니다. 노드 레이블 요구사항을 지정하지 않으면 그 Resource Request는 DEFAULT 파티션에 속한 노드에서만 할당돼요.
  • 운영성(Operability)
    • 노드 레이블과 노드 레이블 매핑은 RM 재시작을 넘어 복구될 수 있습니다.
    • 노드 레이블 갱신 — 관리자는 RM이 실행 중일 때 노드의 레이블과 큐의 레이블을 갱신할 수 있습니다.
  • NM에서 노드 레이블로의 매핑은 세 가지 방식으로 할 수 있지만, 모든 방식에서 Partition Label은 RM에 구성된 유효한 노드 레이블 목록 중 하나여야 합니다.
    • 중앙 집중(Centralized): 노드-레이블 매핑은 RM이 노출한 CLI, REST 또는 RPC로 할 수 있습니다.
    • 분산(Distributed): 노드-레이블 매핑은 NM의 구성된 Node Labels Provider가 설정합니다. YARN에는 두 프로바이더가 있습니다: Script 기반과 Configuration 기반. 스크립트의 경우 NM에 스크립트 경로를 구성할 수 있고 스크립트가 노드의 레이블을 출력합니다. config의 경우 node Labels를 NM의 yarn-site.xml에 직접 구성할 수 있어요. 두 옵션 모두 레이블 매핑의 동적 갱신이 지원됩니다.
    • 위임-중앙 집중(Delegated-Centralized): 노드-레이블 매핑은 RM의 구성된 Node Labels Provider가 설정합니다. 보안 우려로 각 노드가 레이블 매핑을 제공할 수 없거나, 대규모 클러스터에서 각 노드에 대해 RM 인터페이스를 통한 상호작용을 피하려 할 때 유용합니다. NM 등록 중 이 인터페이스에서 레이블을 가져오고 주기적 갱신도 지원됩니다.

구성 (Configuration)

Node Labels 활성화를 위한 ResourceManager 설정

yarn-site.xml에 다음 속성을 설정합니다.

속성 값
yarn.node-labels.fs-store.root-dir <hdfs://namenode:port/path/to/store/node-labels/>
yarn.node-labels.enabled true
yarn.node-labels.configuration-type 노드 레이블의 구성 유형 설정. 관리자는 "centralized", "delegated-centralized" 또는 "distributed"를 지정할 수 있음. 기본값 "centralized".

참고:

  • yarn.node-labels.fs-store.root-dir가 만들어지고 ResourceManager가 접근 권한을 갖는지 확인하세요. (보통 "yarn" 사용자)
  • 노드 레이블을 RM의 로컬 파일 시스템(HDFS 대신)에 저장하려면 file:///home/yarn/node-label 같은 경로를 사용할 수 있습니다.

YARN에 노드 레이블 목록 추가/수정

  • 클러스터 노드 레이블 목록 추가:
    • yarn rmadmin -addToClusterNodeLabels "label_1(exclusive=true/false),label_2(exclusive=true/false)" 를 실행해 노드 레이블을 추가합니다.
    • 사용자가 "(exclusive=...)"를 지정하지 않으면 exclusive는 기본적으로 true입니다.
    • yarn cluster --list-node-labels를 실행해 추가된 노드 레이블이 클러스터에서 보이는지 확인합니다.

YARN에서 노드 레이블 제거

  • 클러스터 노드 레이블 제거:
    • 하나 이상의 노드 레이블을 제거하려면 다음 명령을 실행합니다: yarn rmadmin -removeFromClusterNodeLabels "<label>[,<label>,...]". 명령 인자는 제거할 노드 레이블의 쉼표 구분 목록이어야 합니다.
    • 큐와 연관된(즉 하나 이상의 큐가 접근 권한을 가진) 레이블은 제거할 수 없습니다.
    • 지정된 노드 레이블이 성공적으로 제거됐는지 확인하려면 yarn cluster --list-node-labels 실행.

YARN에 노드-레이블 매핑 추가/수정

  • Centralized NodeLabel 설정에서 노드-레이블 매핑 구성:

    • yarn rmadmin -replaceLabelsOnNode "node1[:port]=label1 node2=label2" [-failOnUnknownNodes] 를 실행하면 node1에 label1, node2에 label2를 추가합니다. 포트를 지정하지 않으면 노드에서 실행 중인 모든 NodeManagers에 레이블을 추가합니다. -failOnUnknownNodes 옵션을 설정하면 지정된 노드가 알려지지 않은 노드일 때 명령이 실패합니다.
    • 노드에서 매핑을 제거하려면 레이블을 지정하지 않고 -replaceLabelsOnNode를 사용합니다. 예: yarn rmadmin -replaceLabelsOnNode "node1"은 node1에서 label1을 제거합니다.
  • Distributed NodeLabel 설정에서 노드-레이블 매핑 구성:

속성 값
yarn.node-labels.configuration-type NM의 구성된 Node Labels Provider에서 노드-레이블 매핑을 가져오려면 RM에서 "distributed" 로 설정해야 함.
yarn.nodemanager.node-labels.provider RM에서 "yarn.node-labels.configuration-type" 이 "distributed" 로 설정되면 관리자는 NM에서 이 파라미터로 노드 레이블 프로바이더를 구성할 수 있음. 관리자는 프로바이더의 "config", "script" 또는 class name 을 구성할 수 있음. 구성된 클래스는 org.apache.hadoop.yarn.server.nodemanager.nodelabels.NodeLabelsProvider 를 확장해야 함. "config" 를 구성하면 "ConfigurationNodeLabelsProvider", "script" 를 구성하면 "ScriptNodeLabelsProvider" 가 사용됨.
yarn.nodemanager.node-labels.resync-interval-ms NM이 노드 레이블을 RM과 동기화하는 간격. NM은 하트비트와 함께 매 x 간격마다 로드한 레이블을 RM에 보냄. 레이블이 수정되지 않아도 이 리싱크가 필요한데, 관리자가 NM이 제공한 클러스터 레이블을 제거했을 수 있기 때문. 기본 2분.
yarn.nodemanager.node-labels.provider.fetch-interval-ms "yarn.nodemanager.node-labels.provider" 가 "config", "script" 또는 AbstractNodeLabelsProvider를 확장하는 구성된 클래스 로 설정되면 주기적으로 노드 레이블이 노드 레이블 프로바이더에서 가져와짐. 이 구성은 주기 간격 정의. -1이면 초기화 동안에만 프로바이더에서 가져옴. 기본 10분.
yarn.nodemanager.node-labels.provider.fetch-timeout-ms "yarn.nodemanager.node-labels.provider" 가 "script" 로 설정되면, 이 구성은 노드 레이블을 조회하는 스크립트를 중단할 타임아웃 기간 제공. 기본 20분.
yarn.nodemanager.node-labels.provider.script.path 실행할 노드 레이블 스크립트. 스크립트 출력에서 "NODE_PARTITION:" 으로 시작하는 줄은 노드 레이블 파티션으로 간주됨. 이 패턴을 가진 스크립트 출력 줄이 여러 개면 마지막 줄이 고려됨.
yarn.nodemanager.node-labels.provider.script.opts 노드 레이블 스크립트에 전달할 인자.
yarn.nodemanager.node-labels.provider.configured-node-partition "yarn.nodemanager.node-labels.provider" 가 "config" 로 설정되면 ConfigurationNodeLabelsProvider가 이 파라미터에서 파티션 레이블을 가져옴.
  • Delegated-Centralized NodeLabel 설정에서 노드-레이블 매핑 구성:
속성 값
yarn.node-labels.configuration-type RM의 구성된 Node Labels Provider에서 노드-레이블 매핑을 가져오려면 "delegated-centralized" 로 설정해야 함.
yarn.resourcemanager.node-labels.provider "yarn.node-labels.configuration-type" 이 "delegated-centralized" 로 설정되면 관리자는 ResourceManager가 노드 레이블을 가져오는 클래스를 구성해야 함. 구성된 클래스는 org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsMappingProvider 를 확장해야 함.
yarn.resourcemanager.node-labels.provider.fetch-interval-ms "yarn.node-labels.configuration-type" 이 "delegated-centralized" 로 설정되면 주기적으로 노드 레이블이 노드 레이블 프로바이더에서 가져와짐. 이 구성은 간격 정의. -1이면 각 노드가 등록된 뒤 한 번만 프로바이더에서 가져옴. 기본 30분.

노드 레이블용 Scheduler 구성

  • Capacity Scheduler 구성
속성 값
yarn.scheduler.capacity.<queue-path>.capacity 큐가 DEFAULT 파티션에 속한 노드에 접근할 수 있는 백분율 설정. 각 부모 아래 직접 자식의 DEFAULT 용량 합계는 100이어야 함.
yarn.scheduler.capacity.<queue-path>.accessible-node-labels 관리자는 각 큐가 접근할 수 있는 레이블을 쉼표로 구분해 지정해야 함. "hbase,storm"은 큐가 label hbase와 storm에 접근할 수 있다는 뜻. 모든 큐는 레이블이 없는 노드에 접근할 수 있으며 지정할 필요 없음. 이 필드를 지정하지 않으면 부모로부터 상속. 큐가 레이블 없는 노드에만 접근할 수 있도록 명시하려면 값에 공백을 넣으면 됨.
yarn.scheduler.capacity.<queue-path>.accessible-node-labels.<label>.capacity 큐가 <label> 파티션에 속한 노드에 접근할 수 있는 백분율 설정. 각 부모 아래 직접 자식의 <label> 용량 합계는 100이어야 함. 기본값 0.
yarn.scheduler.capacity.<queue-path>.accessible-node-labels.<label>.maximum-capacity yarn.scheduler.capacity.<queue-path>.maximum-capacity와 비슷하게, 큐마다 레이블의 maximum-capacity. 기본값 100.
yarn.scheduler.capacity.<queue-path>.default-node-label-expression "hbase" 같은 값. 리소스 요청에 노드 레이블을 지정하지 않고 큐에 제출된 애플리케이션은 "hbase"를 default-node-label-expression으로 사용한다는 뜻. 기본값은 비어 있어서 애플리케이션이 레이블 없는 노드에서 컨테이너를 받음.

노드 레이블 구성 예시:

다음 큐 구조가 있다고 합시다.

                root
            /     |    \
     engineer    sales  marketing

클러스터에 5개 노드(hostname=h1..h5)가 있고 각각 24G 메모리, 24 vcore를 가집니다. 5개 노드 중 1개(h5라고 가정)에 GPU가 있어요. 그래서 관리자가 h5에 GPU 레이블을 추가했습니다.

Capacity Scheduler 구성이 다음과 같다고 합시다(가독성을 위해 key=value 사용):

yarn.scheduler.capacity.root.queues=engineering,marketing,sales
yarn.scheduler.capacity.root.engineering.capacity=33
yarn.scheduler.capacity.root.marketing.capacity=34
yarn.scheduler.capacity.root.sales.capacity=33

yarn.scheduler.capacity.root.engineering.accessible-node-labels=GPU
yarn.scheduler.capacity.root.marketing.accessible-node-labels=GPU

yarn.scheduler.capacity.root.engineering.accessible-node-labels.GPU.capacity=50
yarn.scheduler.capacity.root.marketing.accessible-node-labels.GPU.capacity=50

yarn.scheduler.capacity.root.engineering.default-node-label-expression=GPU

root.engineering/marketing/sales.capacity=33이므로 각각 파티션이 없는 자원의 1/3에 해당하는 보장 자원을 가집니다. 따라서 각각 h1..h4 자원의 1/3, 즉 24 * 4 * (1/3) = (32G mem, 32 v-cores)를 사용할 수 있어요.

그리고 engineering/marketing 큐만 GPU 파티션에 접근 권한이 있습니다(root.<queue-name>.accessible-node-labels 참고).

engineering/marketing 큐 각각은 partition=GPU인 자원의 1/2에 해당하는 보장 자원을 가집니다. 따라서 각각 h5 자원의 1/2, 즉 24 * 0.5 = (12G mem, 12 v-cores)를 사용할 수 있어요.

참고:

  • CapacityScheduler 구성을 마친 뒤 yarn rmadmin -refreshQueues를 실행해 변경을 적용합니다.
  • 구성이 성공적으로 설정됐는지 RM Web UI의 scheduler 페이지로 확인합니다.

애플리케이션의 노드 레이블 지정

애플리케이션은 다음 Java API로 요청할 노드 레이블을 지정할 수 있습니다.

  • ApplicationSubmissionContext.setNodeLabelExpression(..) — 애플리케이션의 모든 컨테이너에 대한 노드 레이블 표현식 설정.
  • ResourceRequest.setNodeLabelExpression(..) — 개별 리소스 요청에 대한 노드 레이블 표현식 설정. ApplicationSubmissionContext에 설정된 노드 레이블 표현식을 덮어쓸 수 있음.
  • ApplicationSubmissionContext에서 setAMContainerResourceRequest.setNodeLabelExpression을 지정해 application master 컨테이너의 기대 노드 레이블을 나타냄.

기본 AM 노드-레이블 구성

속성 값
yarn.resourcemanager.node-labels.am.default-node-label-expression ApplicationMaster 컨테이너에 대해서만 default-node-label-expression을 덮어씀. 기본적으로 비활성화.

모니터링 (Monitoring)

웹 UI로 모니터링

웹 UI에서 다음 레이블 관련 필드를 볼 수 있습니다.

명령줄로 모니터링

  • 클러스터의 레이블을 얻으려면 yarn cluster --list-node-labels 사용.
  • 주어진 노드의 레이블을 포함한 노드 상태를 얻으려면 yarn node -status <NodeId> 사용.

더 알아보기 (Learn more)