Hadoop 2.X 부터 NameNode가 HA를 통해 SPOF(SinglePointOfFailure)에서 벗어났지만, YARN의 ResourceManager는 새로운 SPOF 였음.

하지만 Hadoop 2.4 부터 ResourceManager HA가 도입됨에따라 Hadoop은 이제 SPOF가 완전히 제거된 불사의 존재로 거듭남.


ResourceManager의 HA는 NameNode HA와 유사하게 active/standby로 구성되며 Zookeeper를 이용하는 방식임.

다른점이 있다면 NameNode HA의 경우 DFSZKFailoverController라는 별도의 프로세스가 HA를 담당하던 것과는 달리,

ResourceManager HA는 별도의 모니터링 프로세스가 필요없이 내장되어 있는 Zookeeper 기반의 ActiveStandbyElector가 active 여부를 결정하는 형태라는 것.




* Zookeeper 설치는 아래 페이지의 Zookeeper 설치부분을 참조

[Hadoop] NameNode HA(HighAvailability)







ResourceManager Restart


HA가 도입되기 전, ResourceManager가 죽었다 살아났을 때 혹시나 죽기 전에 미처 처리하지 못한 것들을 다시 처리하기 위해 state-store에 application metadata를 저장했다가 죽기 전에 처리하지 못한 지점부터 처리하는 설정이 있었음.


2가지 방식이 있는데, 하나는 파일(FileSystemRMStateStore)에 저장하는 것이고, 다른 하나는 Zookeeper(ZKRMStateStore)에 저장하는 것.

기본값은 파일에 저장하는 FileSystemRMStateStore인데, 

Zookeeper가 atomic write를 보장하므로 따로 차단 메카니즘이 필요없기 때문에 HA cluster에서는 ZKRMStateStore가 권장됨.

(어차피 HA cluster를 구성하려면 Zookeeper가 필요하기도 하고...)


yarn-site.xml 에 아래 property를 추가하면 state-store를 Zookeeper로 지정가능.

<!-- ResourceManager 시작시 state 복구여부 -->
<property>
    <name>yarn.resourcemanager.recovery.enabled</name>
    <value>true</value>
</property>
<!-- persistent store로 사용할 class -->
<property>
    <name>yarn.resourcemanager.store.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!-- Zookeeper 서버 리스트 -->
<property>
    <name>yarn.resourcemanager.zk-address</name>
    <value>server01:2181,server02:2181,server03:2181</value>
</property>


// yarn 재시작

[root@server01]# /home/hadoop/sbin/stop-yarn.sh

[root@server01]# /home/hadoop/sbin/start-yarn.sh


// Zookeeper 확인

[root@server01]# /home/zookeeper/bin/zkCli.sh


// 최상위 노드에 rmstore가 있고 그 아래로 뭔가 주루룩 있다면 성공

[zk: localhost:2181(CONNECTED) 0] ls /

[rmstore, hadoop-ha, zookeeper]

[zk: localhost:2181(CONNECTED) 1] ls /rmstore

[ZKRMStateRoot]

[zk: localhost:2181(CONNECTED) 2] ls /rmstore/ZKRMStateRoot

[AMRMTokenSecretManagerRoot, RMAppRoot, RMVersionNode, RMDTSecretManagerRoot]

[zk: localhost:2181(CONNECTED) 3] quit






ResourceManager HA


yarn-site.xml 에 아래 property를 추가하면 ResourceManager HA 가능. (최소설정임)

상단에서 지정한 ResourceManager StateStore 관련 설정은 추가되어 있다고 가정함.

<!-- ResourceManager HA 사용여부 -->
<property>
    <name>yarn.resourcemanager.ha.enabled</name>
    <value>true</value>
</property>
<!-- ResourceManager가 leader election에 참가할 cluster 이름 지정 -->
<property>
    <name>yarn.resourcemanager.cluster-id</name>
    <value>cluster1</value>
</property>
<!-- cluster에서 HA를 구성할 ResourceManager id 지정 -->
<property>
    <name>yarn.resourcemanager.ha.rm-ids</name>
    <value>rm1,rm2</value>
</property>
<!-- rm1의 호스트명 -->
<property>
    <name>yarn.resourcemanager.hostname.rm1</name>
    <value>server01</value>
</property>
<!-- rm2의 호스트명 -->
<property>
    <name>yarn.resourcemanager.hostname.rm2</name>
    <value>server02</value>
</property>


// yarn 재시작

[root@server01]# /home/hadoop/sbin/stop-yarn.sh

[root@server01]# /home/hadoop/sbin/start-yarn.sh


// standby용 rm2 시작. (시작/종료를 수동으로 해줘야 함. 귀찮다..)

[root@server02]# /home/hadoop/sbin/yarn-daemon.sh start resourcemanager


// 상태확인

[root@server01]# /home/hadoop/bin/yarn rmadmin -getServiceState rm1

active

[root@server01]# /home/hadoop/bin/yarn rmadmin -getServiceState rm2

standby


여기까지 하면 ResourceManager HA 구성은 완료.

참고로 Web UI 혹은 ResourceManager REST API를 standby ResourceManager로 접근하게 되면 자동으로 active ResourceManager로 redirect 됨. (Web UI 중 About 페이지 제외)






Failover 테스트


// active ResourceManager 확인

[root@server01]# /home/hadoop/bin/yarn rmadmin -getServiceState rm1

active


// active ResourceManager pid 확인

[root@server01]# jps

21025 NameNode

25051 QuorumPeerMain

21449 DFSZKFailoverController

14721 ResourceManager

21257 JournalNode

26058 JobHistoryServer


// active ResourceManager 죽임

[root@server01]# kill -9 14721


// rm2 상태확인

[root@server01]# /home/hadoop/bin/yarn rmadmin -getServiceState rm2

active


// 죽었던 rm1 부활

[root@server01]# /home/hadoop/sbin/yarn-daemon.sh start resourcemanager


// 부활한 rm1 상태확인

[root@server01]# /home/hadoop/bin/yarn rmadmin -getServiceState rm1

standby









[참고]

http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/ResourceManagerRestart.html

http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html









Posted by bloodguy
,