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에서 다음 레이블 관련 필드를 볼 수 있습니다.
- Nodes 페이지: http://RM-Address:port/cluster/nodes — 각 노드의 레이블 확인.
- Node labels 페이지: http://RM-Address:port/cluster/nodelabels — 각 파티션의 유형(exclusive/non-exclusive), 활성 노드 매니저 수, 총 자원 확인.
- Scheduler 페이지: http://RM-Address:port/cluster/scheduler — 각 큐의 레이블 관련 설정과 큐 파티션의 자원 사용 확인.
명령줄로 모니터링
- 클러스터의 레이블을 얻으려면
yarn cluster --list-node-labels사용. - 주어진 노드의 레이블을 포함한 노드 상태를 얻으려면
yarn node -status <NodeId>사용.
유용한 링크 (Useful links)
- Capacity Scheduler 구성 방법을 더 이해하려면 YARN Capacity Scheduler 참고.
- 노드 레이블을 사용해 YARN 애플리케이션을 작성하는 예시: YARN distributed shell, Hadoop MapReduce.
더 알아보기 (Learn more)
- 원문: 문서