YARN Capacity Scheduler와 노드 레이블 설정

Hadoop YARN(Yet Another Resource Negotiator) 클러스터에서 자원 활용 효율성을 극대화하기 위해 노드 레이블(Node Labels) 기능은 특정 유형의 워크로드를 특정 노드 그룹에 할당하는 강력한 메커니즘을 제공합니다. 이는 이종(heterogeneous) 클러스터 환경에서 특히 유용하며, Capacity Scheduler와 함께 구성될 때 더욱 정교한 자원 관리가 가능해집니다.

YARN Capacity Scheduler 활성화

노드 레이블 기능을 Capacity Scheduler와 함께 사용하기 위해서는 먼저 yarn-site.xml 파일에서 Capacity Scheduler를 기본 스케줄러로 지정해야 합니다. 다음은 해당 설정 예시입니다.

<property>
    <name>yarn.resourcemanager.scheduler.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>

Capacity Scheduler 구성 (capacity-scheduler.xml)

Capacity Scheduler의 핵심 구성 파일인 capacity-scheduler.xml에서 큐(queue) 정의, 자원 용량, 그리고 노드 레이블과의 연동 설정을 진행합니다. 다음은 area0, area1, area2라는 세 개의 사용자 지정 큐와 기본(default) 큐를 설정하고, 각 큐에 특정 노드 레이블이 붙은 노드 그룹의 자원을 할당하는 예시입니다.

<configuration>
  <!-- 전체 큐 정의: default, area0, area1, area2 -->
  <property>
    <name>yarn.scheduler.capacity.root.queues</name>
    <value>default,area0,area1,area2</value>
    <description>
      루트 레벨에서 정의된 큐 목록입니다.
    </description>
  </property>

  <!-- 각 큐의 기본 용량 할당 (전체 클러스터 자원 기준) -->
  <property>
    <name>yarn.scheduler.capacity.root.default.capacity</name>
    <value>25</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.area0.capacity</name>
    <value>25</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.area1.capacity</name>
    <value>25</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.area2.capacity</name>
    <value>25</value>
  </property>

  <!-- 각 큐가 최대로 사용할 수 있는 용량 (오버서브스크립션 방지) -->
  <property>
    <name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
    <value>100</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.area0.maximum-capacity</name>
    <value>100</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.area1.maximum-capacity</name>
    <value>100</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.area2.maximum-capacity</name>
    <value>100</value>
  </property>

  <!-- 루트 큐가 접근할 수 있는 모든 노드 레이블 (*는 모든 레이블 포함) -->
  <property>
    <name>yarn.scheduler.capacity.root.accessible-node-labels</name>
    <value>*</value>
  </property>

  <!-- 특정 큐가 접근할 수 있는 노드 레이블 정의 -->
  <property>
    <name>yarn.scheduler.capacity.root.area0.accessible-node-labels</name>
    <value>area0</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.area1.accessible-node-labels</name>
    <value>area1</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.area2.accessible-node-labels</name>
    <value>area2</value>
  </property>

  <!-- 각 노드 레이블 그룹 내에서 루트 큐의 자원 분배 -->
  <property>
    <name>yarn.scheduler.capacity.root.accessible-node-labels.area0.capacity</name>
    <value>33</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.accessible-node-labels.area1.capacity</name>
    <value>33</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.accessible-node-labels.area2.capacity</name>
    <value>34</value>
  </property>

  <!-- 특정 레이블이 지정된 노드 그룹 내에서 해당 큐의 자원 용량 -->
  <property>
    <name>yarn.scheduler.capacity.root.area0.accessible-node-labels.area0.capacity</name>
    <value>100</value> <!-- area0 레이블이 붙은 노드의 모든 자원을 area0 큐에 할당 -->
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.area1.accessible-node-labels.area1.capacity</name>
    <value>100</value> <!-- area1 레이블이 붙은 노드의 모든 자원을 area1 큐에 할당 -->
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.area2.accessible-node-labels.area2.capacity</name>
    <value>100</value> <!-- area2 레이블이 붙은 노드의 모든 자원을 area2 큐에 할당 -->
  </property>

  <!-- 작업 제출 시 기본 노드 레이블 표현식 (큐가 특정 레이블을 명시하지 않을 경우) -->
  <property>
    <name>yarn.scheduler.capacity.root.default-node-label-expression</name>
    <value>,area0,area1,area2</value> <!-- 루트 큐는 레이블이 없는 노드 또는 area0/1/2 레이블 노드에 접근 가능 -->
  </property>
  
  <!-- 각 큐의 기본 노드 레이블 표현식. 비어있으면 해당 레이블이 없는 노드에만 할당됨. -->
  <property>
    <name>yarn.scheduler.capacity.root.default.default-node-label-expression</name>
    <value></value> <!-- default 큐는 레이블이 없는 노드에만 작업 할당 (주의: 레이블 없는 노드가 없으면 작업이 블록될 수 있음) -->
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.area0.default-node-label-expression</name>
    <value>area0</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.area1.default-node-label-expression</name>
    <value>area1</value>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.area2.default-node-label-expression</name>
    <value>area2</value>
  </property>
</configuration>

YARN 노드에 레이블 할당 및 관리

클러스터 노드에 실제 레이블을 부여하고 관리하는 과정은 yarn rmadmin 명령어를 통해 수행됩니다. 다음은 area0, area1, area2 레이블을 클러스터에 추가하고, 특정 호스트에 이 레이블을 할당하는 예시입니다.

# 클러스터에 새로운 노드 레이블 추가
yarn rmadmin -addToClusterNodeLabels area0,area1,area2

# 개별 노드에 레이블 할당 (기존 레이블을 교체)
yarn rmadmin -replaceLabelsOnNode Host1:45454=area0
yarn rmadmin -replaceLabelsOnNode Host2:45454=area1
yarn rmadmin -replaceLabelsOnNode Host3:45454=area2

# 노드의 현재 레이블 상태 확인
yarn node -status Host1:45454
# YARN 웹 UI (ResourceManager UI)를 통해서도 노드의 레이블 상태를 확인할 수 있습니다.

참고: -replaceLabelsOnNode 명령어 사용 시, 콜론(:) 뒤에 노드 포트 번호(예: 45454)를 포함하고 등호(=)로 레이블을 지정해야 합니다.

노드 레이블 정보 영구 저장 설정

YARN ResourceManager가 재시작될 때마다 노드 레이블 정보를 수동으로 다시 설정할 필요가 없도록, 레이블 정보를 HDFS에 영구적으로 저장하도록 구성할 수 있습니다. yarn-site.xml 파일에 다음 속성들을 추가합니다.

<property>
 <name>yarn.node-labels.enabled</name>
 <value>true</value>
</property>
<property>
 <name>yarn.nodemanager.address</name>
 <value>0.0.0.0:45454</value> <!-- NodeManager 주소 설정 -->
</property>

<property>
 <name>yarn.node-labels.manager-class</name>
 <value>org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager</value>
</property>
<property>
 <name>yarn.node-labels.fs-store.root-dir</name>
 <value>hdfs://Host0:8020/yarn/node-labels</value>
 <description>노드 레이블 데이터가 HDFS에 저장될 경로를 지정합니다.</description>
</property>

이 설정을 통해 YARN 클러스터의 노드 레이블 정보는 ResourceManager 재시작 후에도 안정적으로 유지되며, 더욱 효율적인 자원 관리가 가능해집니다.

태그: yarn hadoop CapacityScheduler NodeLabels ResourceManagement

7월 27일 06:56에 게시됨