ResourceManager 고가용성
ResourceManager 고가용성 (High Availability)
이 가이드는 YARN ResourceManager의 고가용성(HA)에 대한 개요를 제공하고, 이 기능을 구성하고 사용하는 방법을 자세히 설명합니다. ResourceManager(RM)는 클러스터의 리소스를 추적하고 애플리케이션(예: MapReduce 작업)을 스케줄링하는 책임을 집니다. Hadoop 2.4 이전에는 ResourceManager가 YARN 클러스터의 단일 장애 지점(single point of failure)이었습니다. HA 기능은 Active/Standby ResourceManager 쌍 형태의 중복성을 추가하여 이 단일 장애 지점을 제거합니다.
출처: 문서
본문
소개 (Introduction)
이 가이드는 YARN ResourceManager의 고가용성에 대한 개요를 제공하고, 이를 구성하고 사용하는 방법을 자세히 설명합니다. ResourceManager는 클러스터의 리소스를 추적하고 애플리케이션(예: MapReduce 작업)을 스케줄링하는 책임을 집니다. Hadoop 2.4 이전에는 ResourceManager가 YARN 클러스터의 단일 장애 지점이었습니다. HA 기능은 Active/Standby ResourceManager 쌍 형태의 중복성을 추가하여 이 단일 장애 지점을 제거합니다.
아키텍처 (Architecture)
RM 장애 조치 (RM Failover)
ResourceManager HA는 Active/Standby 아키텍처로 실현됩니다 - 어느 시점에서든 하나의 RM이 Active이고, 하나 이상의 RM이 Active에 무슨 일이 생기면 인계받기 위해 대기하는 Standby 모드입니다. active로의 전이 트리거는 관리자(CLI를 통해) 또는 자동-장애조치가 활성화되었을 때 통합된 failover-controller에서 옵니다.
수동 전환과 장애 조치 (Manual transitions and failover)
자동 장애 조치가 활성화되지 않았을 때, 관리자는 RM 중 하나를 수동으로 Active로 전환해야 합니다. 한 RM에서 다른 RM으로 장애 조치하려면 먼저 Active-RM을 Standby로 전환하고 Standby-RM을 Active로 전환해야 합니다. 이 모든 것은 "yarn rmadmin" CLI로 수행할 수 있습니다.
자동 장애 조치 (Automatic failover)
RM에는 어떤 RM이 Active가 되어야 할지를 결정하는 Zookeeper 기반 ActiveStandbyElector를 내장할 옵션이 있습니다. Active가 다운되거나 응답하지 않으면 다른 RM이 자동으로 Active로 선출되어 인계받습니다. HDFS의 경우처럼 별도의 ZKFC 데몬을 실행할 필요가 없습니다. RM에 내장된 ActiveStandbyElector가 별도의 ZKFC 데몬 대신 장애 감지기(failure detector)와 리더 선출기(leader elector) 역할을 하기 때문입니다.
RM 장애 조치 시 클라이언트, ApplicationMaster, NodeManager
여러 RM이 있을 때, 클라이언트와 노드가 사용하는 구성(yarn-site.xml)은 모든 RM을 나열할 것으로 예상됩니다. 클라이언트, ApplicationMaster(AM), NodeManager(NM)는 Active RM에 도달할 때까지 라운드로빈 방식으로 RM에 연결을 시도합니다. Active가 다운되면 "새" Active에 도달할 때까지 라운드로빈 폴링을 재개합니다. 이 기본 재시도 로직은 org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider로 구현됩니다. org.apache.hadoop.yarn.client.RMFailoverProxyProvider를 구현하고 yarn.client.failover-proxy-provider 값을 클래스 이름으로 설정하여 로직을 재정의할 수 있습니다. 비-HA 모드에서 실행할 때는 대신 yarn.client.failover-no-ha-proxy-provider 값을 설정하세요.
이전 active-RM의 상태 복구 (Recovering previous active-RM's state)
ResourceManager Restart가 활성화되면 active 상태로 승격된 RM은 RM 내부 상태를 로드하고, RM 재시작 기능에 따라 가능한 한 이전 active가 멈춘 지점부터 계속 운영합니다. 이전에 RM에 제출된 각 관리되는 애플리케이션에 대해 새 attempt가 생성됩니다. 애플리케이션은 작업 손실을 피하기 위해 주기적으로 체크포인트를 할 수 있습니다. 상태 저장소(state-store)는 Active/Standby RM 양쪽에서 보여야 합니다. 현재 지속성을 위한 RMStateStore 구현이 두 개 있습니다 - FileSystemRMStateStore와 ZKRMStateStore입니다. ZKRMStateStore는 어느 시점에서든 단일 RM에 암시적으로 쓰기 접근을 허용하므로, HA 클러스터에서 사용하기에 권장되는 저장소입니다. ZKRMStateStore를 사용할 때는 여러 RM이 Active 역할을 잠재적으로 가정할 수 있는 스플릿-브레인(split-brain) 상황을 다루기 위한 별도의 펜싱(fencing) 메커니즘이 필요 없습니다. ZKRMStateStore를 사용할 때, ZooKeeper 관리자가 YARN 애플리케이션/사용자 자격 증명 정보에 접근할 수 없도록 Zookeeper 클러스터에서 "zookeeper.DigestAuthenticationProvider.superDigest" 속성을 설정하지 않는 것이 좋습니다.
배포 (Deployment)
Configurations
대부분의 장애 조치 기능은 다양한 구성 속성으로 조정할 수 있습니다. 다음은 필수/중요한 것들의 목록입니다. yarn-default.xml은 모든 노브의 전체 목록을 담고 있습니다. 기본값을 포함한 더 많은 정보는 yarn-default.xml을 참조하세요. 상태 저장소 설정에 대한 지침은 ResourceManager Restart 문서도 참조하세요.
| Configuration Properties | Description | | yarn.resourcemanager.zk-address | ZK-quorum의 주소. 상태 저장소와 내장 리더 선출 모두에 사용됩니다. | yarn.resourcemanager.ha.enabled | RM HA를 활성화합니다. | yarn.resourcemanager.ha.rm-ids | RM의 논리적 ID 목록. 예: "rm1,rm2". | yarn.resourcemanager.hostname.rm-id | 각 rm-id에 대해 RM이 대응하는 호스트네임을 지정합니다. 또는 각 RM의 서비스 주소를 설정할 수도 있습니다. | yarn.resourcemanager.address.rm-id | 각 rm-id에 대해 클라이언트가 작업을 제출할 host:port를 지정합니다. 설정하면 yarn.resourcemanager.hostname.rm-id의 호스트네임을 덮어씁니다. | yarn.resourcemanager.scheduler.address.rm-id | 각 rm-id에 대해 ApplicationMaster가 리소스를 얻을 scheduler host:port를 지정합니다. 설정하면 yarn.resourcemanager.hostname.rm-id의 호스트네임을 덮어씁니다. | yarn.resourcemanager.resource-tracker.address.rm-id | 각 rm-id에 대해 NodeManager가 연결할 host:port를 지정합니다. 설정하면 yarn.resourcemanager.hostname.rm-id의 호스트네임을 덮어씁니다. | yarn.resourcemanager.admin.address.rm-id | 각 rm-id에 대해 관리 명령을 위한 host:port를 지정합니다. 설정하면 yarn.resourcemanager.hostname.rm-id의 호스트네임을 덮어씁니다. | yarn.resourcemanager.webapp.address.rm-id | 각 rm-id에 대해 RM 웹 애플리케이션이 대응하는 host:port를 지정합니다. yarn.http.policy를 HTTPS_ONLY로 설정하면 필요하지 않습니다. 설정하면 yarn.resourcemanager.hostname.rm-id의 호스트네임을 덮어씁니다. | yarn.resourcemanager.webapp.https.address.rm-id | 각 rm-id에 대해 RM https 웹 애플리케이션이 대응하는 host:port를 지정합니다. yarn.http.policy를 HTTP_ONLY로 설정하면 필요하지 않습니다. 설정하면 yarn.resourcemanager.hostname.rm-id의 호스트네임을 덮어씁니다. | yarn.resourcemanager.ha.id | 앙상블에서 RM을 식별합니다. 선택사항입니다. 하지만 설정하면 관리자는 구성에서 모든 RM이 자신의 ID를 갖도록 보장해야 합니다. | yarn.resourcemanager.ha.automatic-failover.enabled | 자동 장애 조치를 활성화합니다. 기본적으로 HA가 활성화될 때만 활성화됩니다. | yarn.resourcemanager.ha.automatic-failover.embedded | 자동 장애 조치가 활성화되었을 때 Active RM을 선출하기 위해 내장 리더 선출기를 사용합니다. 기본적으로 HA가 활성화될 때만 활성화됩니다. | yarn.resourcemanager.cluster-id | 클러스터를 식별합니다. 선출기가 RM이 다른 클러스터의 Active를 인계받지 않도록 보장하는 데 사용됩니다. | yarn.client.failover-proxy-provider | 클라이언트, AM, NM이 Active RM으로 장애 조치하기 위해 사용할 클래스. | yarn.client.failover-no-ha-proxy-provider | HA 모드가 아닐 때 클라이언트, AM, NM이 Active RM으로 장애 조치하기 위해 사용할 클래스. | yarn.client.failover-max-attempts | FailoverProxyProvider가 장애 조치를 시도해야 하는 최대 횟수. | yarn.client.failover-sleep-base-ms | 장애 조치 사이의 지수적 지연을 계산하는 데 사용할 sleep 기준(밀리초). | yarn.client.failover-sleep-max-ms | 장애 조치 사이의 최대 sleep 시간(밀리초). | yarn.client.failover-retries | 하나의 ResourceManager에 연결하기 위한 시도당 재시도 횟수. | yarn.client.failover-retries-on-socket-timeouts | 소켓 타임아웃 시 하나의 ResourceManager에 연결하기 위한 시도당 재시도 횟수.
샘플 구성 (Sample configurations)
RM 장애 조치를 위한 최소 설정의 예는 다음과 같습니다.
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster1</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>master1</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>master2</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>master1:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>master2:8088</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>zk1:2181,zk2:2181,zk3:2181</value>
</property>
관리 명령 (Admin commands)
yarn rmadmin에는 RM의 상태/건강을 확인하고 Active/Standby로 전환하는 몇 가지 HA 특화 명령 옵션이 있습니다. HA 명령은 yarn.resourcemanager.ha.rm-ids로 설정된 RM의 서비스 id를 인자로 취합니다.
$ yarn rmadmin -getServiceState rm1
active
$ yarn rmadmin -getServiceState rm2
standby
자동 장애 조치가 활성화되어 있으면 수동 전환 명령을 사용할 수 없습니다. --forcemanual 플래그로 이를 재정의할 수 있지만 주의가 필요합니다.
$ yarn rmadmin -transitionToStandby rm1
Automatic failover is enabled for org.apache.hadoop.yarn.client.RMHAServiceTarget@1d8299fd
Refusing to manually manage HA state, since it may cause
a split-brain scenario or other incorrect state.
If you are very sure you know what you are doing, please
specify the forcemanual flag.
자세한 내용은 YarnCommands를 참조하세요.
ResourceManager 웹 UI 서비스
Standby RM이 실행 중이라고 가정하면, Standby는 "About" 페이지를 제외한 모든 웹 요청을 자동으로 Active로 리디렉션합니다.
웹 서비스 (Web Services)
Standby RM이 실행 중이라고 가정하면, ResourceManager REST APIs에 설명된 RM 웹 서비스는 Standby RM에서 호출될 때 자동으로 Active RM으로 리디렉션됩니다.
로드 밸런서 설정 (Load Balancer Setup)
로드 밸런서(예: Azure 또는 AWS) 뒤에서 ResourceManager 집합을 실행하고 로드 밸런서가 active RM을 가리키게 하려면 /isActive HTTP 엔드포인트를 헬스 프로브로 사용할 수 있습니다. http://RM_HOSTNAME/isActive는 RM이 Active HA 상태이면 200 상태 코드 응답을, 그렇지 않으면 405를 반환합니다.
더 알아보기 (Learn more)
- 원문: 문서