SlideShare a Scribd company logo
1 of 70
하둡 고가용성
HA(High Availability) 설정
김진규
1
HA 구성도
2
HA 개념 (1)
1. HA에서의 주키퍼 주 기능
Failure detection :
네임노드를 감시하여 시스템을 감시한다.
Active NameNode election :
네임노드가 죽었을시, 그 다음 네임노드 후보를 선
출한다.
2. ZKFC(zookeeper failover controller)
Health monitoring : 상태 모니터링
ZooKeeper session management : 주키퍼의 세션관리
ZooKeeper-based election : 주키퍼 기반 선거(리더선출)
3
HA 개념 (2) - 두 개의 네임노드
두 개의 네임노드는 Active 네임 노드, Standby 네임 노드라 부른다.
Active네임 노드에 장애가 생기면, 두번째 네임노드인 Stanby 네임 노드가 Active한 상태로 바뀌
면서 네임 노드의 역할을 맡는 방식이다. Active 네임 노드와 Standby 네임 노드는 데이터 노드로
부터 블록 리포트, 하트비트를 모두 받아서 동일한 메타데이터를 유지하고, 저널노드를 이용하여
editFile을 공유한다.
요약하자면, active 네임도느는 네임노드의 역할을 수행하고, standby 네임노드는 active 네임노드
와 동일한 메타데이터 정보를 유지, active 네임노드에 문제가 발생하면 standby 네임노드가
active 네임노드로 동작. active 네임노드에 문제가 발생하는 것을 자동으로 확인하는 것이 어렵기
때문에 주키퍼를 이용, 장애 발생 시 자동으로 상태변경이 가능하도록 한다.
4
HA 개념 (3) - 저널 노드
저널 노드 :
네임노드로부터 받은 트랜잭션(edit log)내용을 저널 노드 자신의 로컬 디스크에 저장한다.
해당 edit log 내용은 전체 저널 노드들에 동시에 쓰여진다.
저널노드는 홀수갯수만큼 있는게 좋다. 절반 이상의 저널노드가 동작 중이어야 edit log를
fsimage에 반영할 수 있기 때문.
fsimage :
파일시스템에 존재하는 모든 디렉토리와 파일의 아이노드 정보를 직렬화한 파일.
각 아이노드는 파일이나 디렉터리 메타데이터의 내부 구조를 나타내며 파일의 복제 수준, 변경 및
접근 시간, 접근 권한, 블록 크기, 파일을 구성하는 블록 집합과 같은 정보를 가지고 있다.
5
HA 개념 (4) - 정리
요약 :
주키퍼는 active name node와 standby name node를 이용한 HA를 가능하게 해주는 분산 코디네이터.
주키퍼는 어떤 노드가 active인지, standby인지를 저장함으로 네임 노드들을 관리한다
주키퍼는 단 하나의 네임 노드만 active상태에 있는 것을 보장.
주키퍼는 평소에 네임노드들과 세션을 유지하고 있다. 만약 active가 반응이 없으면 주키퍼는 바로 standby에게
active의 장애를 알린다.
여러 standby 네임노드가 있다면, 어떤 것을 active name node를 리더로 선출할 지는 주키퍼가 제공하는 리더 선출
기능에 의해 정해진다.
6
HA 개념 (5) - 정리
주키퍼는 3대 이상의 홀수 개수 만큼 있는 것이 좋다.
하둡 설정에 의해 주키퍼는 기본적으로 3대가 설정되어 있어야 한다.
네임노드가 두개라고 해서 두개의 주키퍼 서버를 설정하면 오류가 난다.
주키퍼는 하나의 리더와 다수의 팔로워로 구성. 리더가 주키퍼로 들어오는 데이터의 분산을 도맡아 한다.
모든 리더와 팔로워들은 똑같은 데이터를 동기화하고있어 어떤 서버에서 데이터를 읽어도 같은 데이터를
읽을 수 있다.
확실하지 않은 정보
- 주키퍼 서버의 리더선출과, 네임노드서버끼리의 리더선출은 서로 다른 듯?
7
참조 - Fencing(펜싱)
Fencing :
네임노드가 장애가 아닌데, 네트워크 문제나, cpu과부하 상황에서 기존의 액티브
네임노드가 죽었다고 판단하여 새로운 네임노드가 active로 승격 될 수 있다.
이때 기존의 네임노드는 아직도 자기가 active라고 생각하는데,
이 상황을 split brain이라고 한다. 이를 방지하기 위해 기존의 액티브 네임노드를
확실하게 죽이는 것을 펜싱(fencing)이라고 한다.
8
1. 네임노드 이중화
9
네임노드 이중화 - 서비스 구성 계획
10
hadoop ver 3.1.3
zookeeper ver 3.6.3
hostname set hadoop01, hadoop02,
hadoop03, hadoop04
all username hadoop01
hadoop01 주키퍼, 액티브 네임노드, 저널노드, 데이터
노드, 노드매니저, 리소스매니저(액티브)
hadoop02 주키퍼, 스탠바이 네임노드, 저널노드, 데이
터노드, 노드매니저, 리소스매니저(스탠바이)
hadoop03 주키퍼, 저널노드 , 데이터노드, 노드매니저
hadoop04 데이터노드, 노드매니저
네임노드 이중화
시작 전 설정 :
모든 유저네임은 hadoop01로 진행.
모든 노드간 쌍방 키젠 완료 및 authorized_keys에 각자의 공개키 등록된 상태,
자바 설치 완료, 하둡 기본 설치 완료.
etc/hosts 설정
11
주키퍼 쿼럼을 형성할 hadoop01~hadoop03에 주키퍼 설치
hadoop01에 설치 후 기본 설정 후에 일괄 배포 예정
권한 주고 압축 풀기
chmod 775 apache-zookeeper-3.6.3-bin.tar.gz
tar -xvzf apache-zookeeper-3.6.3-bin.tar.gz
12
네임노드 이중화
/home디렉토리에 주키퍼 폴더 생성. 그 하위로 압축 푼 내용 이동 후에 소유권 주기.
Sudo mkdir /home/zookeeper
Sudo mv /home/hadoop01/Download/apache-zookeeper-3.6.3-bin /home/zookeeper
Sudo chown -R hadoop01:hadoop01 zookeeper
13
네임노드 이중화
bin : 주키퍼 클라이언트와 서버 실행을 위한 쉘 스크립트 파일
conf : 주키퍼 환경설정을 위한 파일.
샘플파일 복사해서 사용
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
14
네임노드 이중화
vi zoo.cfg 수정 :
15
하단에 주키퍼 그룹 정보 추가 입력
네임노드 이중화
dataDir 설정. 후에 주키퍼 실행 시 myid를 읽어 올 디렉토리
server.n :
주키퍼 서버 n이 사용하는 주소와 포트 번호를 지정한다
세개의 필드를 가지고 있으며(:로 구분되는) 첫번째 필드는 호스트 이름 또는 IP주소, 두번째와 세번째
필드는 쿼럼 통신과 리더 선출에 사용하는 TCP 포트 번호다.
clientPort :
클라이언트가 서버로 연결하기 위해 사용하는 TCP 포트. 기본 포트는 2181이다
dataDir :
인 메모리 데이터베이스의 퍼지 스냅샷이 저장되는 디렉토리. 서버가 주키퍼 앙상블의 구성원이라면
이 디렉토리에 id파일이 존재한다.
tickTime :
밀리초 단위로 설정되는 틱 시간이다. 틱은 주키퍼가 사용하는 시간에 대한 기본 측정 단위다.
16
네임노드 이중화
저장 후 모든 주키퍼 서버에 배포 (hadoop01~hadoop03)
● 전송
sudo scp -rp zookeeper hadoop02:/home/
sudo scp -rp zookeeper hadoop03:/home/
● 권한 부여
ssh root@hadoop02 chown -R hadoop01:hadoop01 /home/zookeeper
ssh root@hadoop03 chown -R hadoop01:hadoop01 /home/zookeeper
17
네임노드 이중화
각 서버의 id를 설정해야 한다.
conf 파일 내용
1. conf파일에서 지정한 위치(datadir)에 data 디렉토리 생성
2. data 디렉토리에 myid 파일 생성
mkdir /home/zookeeper/data
vi myid
18
주키퍼 쿼럼 통신을 위한 포트
리더 선출을 위한 포트
네임노드 이중화
호스트 id
각 호스트에 맞는 서버명 server.n에 해당되는 n을 입력 후 저장
hadoop01 vi /home/zookeeper/data/myid 1 입력
hadoop02 vi /home/zookeeper/data/myid 2 입력
hadoop03 vi /home/zookeeper/data/myid 3 입력
19
네임노드 이중화
echo 1 > myid
echo 2 > myid
echo 3 > myid
hadoop01의 myid파일 예시
편의성을 위한 alias 설정(권장) :
vi ~/.bashrc
아래 내용 추가 입력 후 source ~/.bashrc 각 서버에 배포
scp ~/.bashrc hadoop02:~/
scp ~/.bashrc hadoop03:~/
ssh hadoop02 source ~/.bashrc
ssh hadoop03 source ~/.bashrc
20
네임노드 이중화
주키퍼 그룹으로 지정한 각 서버(hadoop01~hadoop03)에서
zookeeper-start 명령어로 실행(앞에서 alias설정 시 가능)
21
네임노드 이중화
● 세개의 서버에 모두 실행 후 zookeeper-status로 상태 확인
22
hadoop02가 리더인 상태
네임노드 이중화
hadoop01
hadoop02
hadoop03
● 하둡과 연동
vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/local/java
export HADOOP_HOME=/home/hadoop/hadoop-3.1.3
export HADOOP_PID_DIR=/home/hadoop/hadoop-3.1.3/pids
23
네임노드 이중화
pid 파일
프로세스의 고유 식별번호! 주로 특정 프로세스의 실행 여부 판단에 사용된다.
이전에 $HADOOP_HOME에 mkdir pids 로 생성했던 디렉토리로 경로 지정 해주었다.
● 기존에 있던 master파일은 사용하지 않는다.
workers파일 수정
24
네임노드 이중화
● core-site.xml파일 수정(xml파일은 hadoop01에서 설정 후 일괄 배포)
25
기본 파일시스템 이름
주키퍼 서버 리스트
네임노드 이중화
hdfs-site.xml 수정 (1)
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/data/dfs/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/data/dfs/datanode</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/data/dfs/journalnode</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>hadoop-cluster</value>
</property>
<property>
<name>dfs.ha.namenodes.hadoop-cluster</name>
<value>nn1,nn2</value>
</property>
hadoop-cluster는 이 파일에서 새로 정의해주는,
네임노드들의 클러스터를 의미한다.
hadoop-cluster 네임서비스의 namenode id 지정
저널 노드가 edit logs를 저장할 경로
26
네임노드 이중화
hdfs-site.xml 수정 (2)
<property>
<name>dfs.namenode.rpc-address.hadoop-cluster.nn1</name>
<value>hadoop01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hadoop-cluster.nn2</name>
<value>hadoop02:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.hadoop-cluster.nn1</name>
<value>hadoop01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.hadoop-cluster.nn2</name>
<value>hadoop02:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/hadoop-cluster</value>
</property>
nn1 NameNode의 RPC 포트
nn2 NameNode의 RPC 포트
nn1 NameNode의 Web UI 포트
후에 active, standby 상태를 웹으로 쉽게 확인 할 수 있다.
27
네트워크로부터 떨어져 있는 컴퓨터에서 코드를 실행하는 방식
= 원격 프로시저 콜 (Remote procedure call)
nn2 NameNode의 Web UI 포트
NameNode가 edit log를 쓰고 읽을 JournalNode URI
URI(Uniform Resource Identifier)는 하나의 리소스를 가리키는 문자열을 칭한다.
가장 흔한 URI는 URL로, 웹 상에서의 위치로 리소스를 식별한다.
네임노드 이중화
hdfs-site.xml 수정 (3)
<property>
<name>dfs.client.failover.proxy.provider.hadoop-cluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop01/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
NameNode Failover 상황에서 기존 active NameNode를 차단할 때 사용할 방법 지정
HDFS 클라이언트가 active NameNode에 접근할 때 사용되는 Java Class
(hdfs에 파일이 올라가지 않는다면 이 설정에 오류가 없는지 의심해보자)
ha.fencing.method를 sshfence로 지정했을 경우 ssh를 경유해 기존 active
NameNode를 죽이는데, 이때 passphrase를 통과하기 위해 SSH private key file을 지
정해야 함. (이를 위해 미리 keygen 생성을 해놓아야 한다.)
28
자동 장애복구 지정
네임노드 이중화
yarn-site.xml 수정 (1)
<configuration> <!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/home/hadoop/data/yarn/nm-local-dir</value>
</property>
<property>
<name>yarn.resourcemanager.fs.state-store.uri</name>
<value>/home/hadoop/data/yarn/system/rmstore</value>
</property>
<property>
29
네임노드 이중화
yarn-site.xml 수정 (2)
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop01</value>
</property>
<property>
<name>yarn.web-proxy.address</name>
<value>0.0.0.0:8089</value>
</property>
</configuration>
프록시 서버(Proxy Server)란 시스템에 방화벽을 가지고 있는 경우 외부와
의 통신을 위해 만들어 놓은 서버.
프록시(Proxy)란 원래 '대리' 라는 의미를 가지고 있음.
프록시 서버는 클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접
적으로 접속할 수 있게 해주는 컴퓨터
30
네임노드 이중화
hadoop01에서 설정한 위의 사항들을 hadoop02~hadoop04로 배포 :
scp hadoop-env.sh hadoop02:/home/hadoop/hadoop-3.1.3/etc/hadoop/
scp hadoop-env.sh hadoop03:/home/hadoop/hadoop-3.1.3/etc/hadoop/
scp hadoop-env.sh hadoop04:/home/hadoop/hadoop-3.1.3/etc/hadoop/
scp workers hadoop02:/home/hadoop/hadoop-3.1.3/etc/hadoop/
scp workers hadoop03:/home/hadoop/hadoop-3.1.3/etc/hadoop/
scp workers hadoop04:/home/hadoop/hadoop-3.1.3/etc/hadoop/
scp core-site.xml hadoop02:/home/hadoop/hadoop-3.1.3/etc/hadoop/
scp core-site.xml hadoop03:/home/hadoop/hadoop-3.1.3/etc/hadoop/
scp core-site.xml hadoop04:/home/hadoop/hadoop-3.1.3/etc/hadoop/
scp hdfs-site.xml hadoop02:/home/hadoop/hadoop-3.1.3/etc/hadoop/
scp hdfs-site.xml hadoop03:/home/hadoop/hadoop-3.1.3/etc/hadoop/
scp hdfs-site.xml hadoop04:/home/hadoop/hadoop-3.1.3/etc/hadoop/
scp yarn-site.xml hadoop02:/home/hadoop/hadoop-3.1.3/etc/hadoop/
scp yarn-site.xml hadoop03:/home/hadoop/hadoop-3.1.3/etc/hadoop/
scp yarn-site.xml hadoop04:/home/hadoop/hadoop-3.1.3/etc/hadoop/
31
네임노드 이중화
하둡 HA 실행 순서 :
1. 주키퍼 포맷
2. 3개의 저널노드 실행
3. Active 네임노드 실행
4. Standby 네임노드 실행
5. 주키퍼 장애 컨트롤러 (zkfc)실행
6. 데이터노드 실행
7. 얀 클러스터 실행
8. 히스토리서버 실행
32
네임노드 이중화
편리한 실행을 위한 alias 등록 :
vi ~/.bashrc
alias hadoop="~/hadoop/sbin/hadoop-daemon.sh"
alias hdfs="~/hadoop/bin/hdfs"
alias yarn="~/hadoop/bin/yarn"
source ~/.bashrc 후에 타 서버 배포 후 환경변수 활성화
33
네임노드 이중화
34
주키퍼 포맷 :
hdfs zkfc -formatZK
hadoop01~hadoop03에서 주키퍼가 실행 된 상태여야 한다
네임노드 이중화
저널노드 실행 :
이제 hadoop01부터 hadoop03까지 저널노드를 설정한 기기들에서 각각 저널노드를 시작해준다. 위
의 .bashrc파일을 각 기기에 설정해주었다면 아래의 커맨드로 실행이 가능
hadoop start journalnode hadoop01 ~ hadoop03 까지 반복
실행 후 jps :
주키퍼
저널 노드
35
네임노드 이중화
hadoop01에서 hdfs 포맷 :
hdfs namenode -format
(네임노드 포맷은 신중히! 처음 실행시에는 포맷 필수)
36
네임노드 이중화
액티브 네임노드 실행 :
hadoop01에서
hadoop start namenode
37
네임노드 이중화
hadoop02에서 스탠바이 네임노드 실행 준비 :
hadoop02에서 hdfs namenode -bootstrapStandby
명령어로 active네임노드의 메타데이터를 복사해온다. 정상 작동 시 아래 내용 출력.
38
네임노드 이중화
오류 - a shared edits dir must not be specified if HA is not enabled. (1)
현상 - 스탠바이 네임노드가 액티브 네임노드의 메타데이터 복사에 실패
확인해보니 복사해야 할 hadoop01 의 네임노드가 죽어있는 상태
39
원인 파악 및 해결 - hadoop01의 네임노드 로그확인
a shared edits dir must not be specified if HA is not enabled.
HA에 관한 오류인 듯 HA를 설정한 hdfs-site.xml확인.
오타 발견, 수정 후 재실행. 네임노드 정상 실행 확인
40
오류 - a shared edits dir must not be specified if HA is not enabled. (2)
오류 - journal at hadoop01 has no edit logs (1)
hdfs namenode -bootstrabStandby 입력 후 다른 오류가 발생했다.
41
active Namenode는 정상실행 됐지만 다른 문제가 발생
journal at hadoop01 has no edit logs
해결
로그 확인해보니 이전 데이터와 충돌된 듯한 느낌.
이전에 있던 저널노드데이터 삭제. 네임노드 데이터 삭제. 포맷 후에 재실행.
42
극단적인 방법이긴 했지만, 정상작동 확인
오류 - journal at hadoop01 has no edit logs (2)
오류 - FSIamageSaver clean checkpoint: shutdown (1)
현상 - 스탠바이 네임노드가 액티브 네임노드의 메타데이터 복사에 실패
43
저널노드 키고, 액티브 네임노드 키고,
스탠바이 네임노드에서 bootstrapStandby 입력하니 에러..
네임노드 로그 확인
fsimage에 문제가 있는듯
원인 파악
44
검색 결과
standby namenode and journal node configurations were in a corrupted state, so that when the cluster tried to switch to the
standby, you encountered the error that you reported. Initially we have to put the primary namenode into safemode and saved the
namespace with the following commands: hdfs dfsadmin -safemode enter hdfs dfsadmin -saveNamespace su - hdfs -c "hdfs
namenode -bootstrapStandby -force" this was to make sure that the namenode was in a consistent state before we attempted to
restart the HDFS components one last time to make sure all processes started cleanly and that HDFS would automatically leave
safemode
- 위 내용을 바탕으로 예상한 원인
이전에 네임노드 이중화 실험을 위해 active네임노드를 강제적으로 죽여서 standby네임노드가
active로 된 상태에서 종료했었다. 이 때 마지막 액티브 네임노드였던 hadoop02에서 실행을 했어
야 했는데 standby였던 hadoop01에서 실행, hadoop02에서 active노드 메타데이터 복사 요청으로
인해 오류가 난 듯 하다. hadoop01, hadoop02 네임노드 모두 실행 후 마지막 액티브 네임노드였던
hadoop02에서 오류 해결 시도
오류 - FSIamageSaver clean checkpoint: shutdown (2)
해결 - safemode 사용 namespace 저장
45
일단 hadoop01, hadoop02 네임노드 둘다 키고, 마지막 액티브 네임노드였던 hadoop02에서 진행
hdfs dfsadmin -safemode enter
hdfs dfsadmin -saveNamespace
hdfs dfsadmin -safemode leave
오류 - FSIamageSaver clean checkpoint: shutdown (3)
해결 - safemode 사용 namespace 저장
46
현재 실행중이던 스탠바이 네임노드 종료 후 hdfs namenode -bootstrapStandby -force 입력
정상 완료. 이후에 다시 스탠바이 네임노드 시작
생각보다 자주 발생하는 오류였다.
오류 - FSIamageSaver clean checkpoint: shutdown (4)
hadoop02에서 스탠바이 네임노드 실행 :
hadoop start namenode
47
네임노드 이중화
alias 추가 설정 :
vi ~/.bashrc
입력 후 source ~/.bashrc
48
네임노드 이중화
● 데이터노드 실행
hadoop01~hadoop04 모두 실행
hadoop start datanode
● yarn 실행
hadoop01에서 실행
yarn-start
● historyserver 실행
hadoop01, hadoop02에서 실행
49
네임노드 이중화
● 주키퍼 장애 컨트롤러 실행
hadoop01, hadoop02 네임노드들에서 실행
hadoop start zkfc (zookeeper failover controller)
50
네임노드 이중화
오류 - you must configure a fencing method before using automatic failover.
원인 및 해결 - 단순 오타
ssfence가 아니라 sshfence를 입력 해야 한다.
hdfs-site.xml에서 수정 후 문제 해결
51
오류 - 두 개의 네임노드 모두 standby 상태
해결 - zkFC 실행 시 하나가 active로 전환된다.
52
zkfc를 실행했어도 active 전환이 안된다면 네임노드 설정과 주키퍼 앙상블 설정 재확인
● 실행 완료 확인
hadoop01 hadoop02
hadoop04
hadoop03
53
네임노드 이중화
● zkfc 작동 확인
먼저 active, standby 네임노드의 상태를 웹에서 확인해보자
이 상태에서 hadoop01의 네임노드를 강제로 종료 했을 때
hadoop02의 standby 상태가 active상태로 바뀌면 성공
54
네임노드 이중화
● active 네임노드 kill
액티브 네임노드(hadoop01) kill 12211
hadoop02
standby -> active 전환 확인
55
네임노드 이중화
● standby 네임노드의 로그 확인
56
네임노드 이중화
standby -> active로 전환 확인
● 기존 네임노드가 kill 된 상태에서 hadoop02 정상작동 확인.
57
네임노드 이중화
hadoop02(현재 active namenode)에서 진행
hdfs dfs -cat /README.txt
이중화 완료.
2. 리소스 매니저 이중화
58
RM 이중화(HA)는 네임노드 이중화(HA)와 유사하게 active/standby로 구성되
며 Zookeeper를 이용하는 방식.
네임노드 이중화와 달리 RM 이중화(HA)는 별도의 모니터링 프로세스가 필
요없이 내장되어 있는 Zookeeper 기반의 ActiveStandbyElector가 active 여
부를 결정한다.
59
RM 이중화 - 개념
● yarn-site.xml에 추가 입력(1)
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
60
RM 이중화
ResourceManager 시작시 state 복구여부
persistent store로 사용할 class
Zookeeper 서버 리스트
ResourceManager HA 사용여부
● yarn-site.xml에 추가 입력(2)
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>rm-cluster</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop02</value>
</property>
61
RM 이중화
ResourceManager가 leader election에 참가할 cluster 이름 지정
cluster에서 HA를 구성할 ResourceManager id 지정
rm1의 호스트명
rm2의 호스트명
● 입력 후 다른 노드들에 배포
62
RM 이중화
● 실행
1. 액티브 네임노드 실행
2. 스탠바이 네임노드 실행
3. 데이터 노드 실행
4. 액티브 리소스매니저 실행(hadoop01에서 yarn-start)
5. 스탠바이 리소스매니저 실행(hadoop02에서 yarn-start)
6. 주키퍼 장애 컨트롤러 실행
63
RM 이중화
● RM 상태 확인
/home/hadoop/bin/yarn rmadmin -getServiceState rm1
/home/hadoop/bin/yarn rmadmin -getServiceState rm2
64
RM 이중화
hadoop01 리소스매니저 - standby 상태
hadoop02 리소스매니저 - active 상태
hadoop01 네임노드 상태 - standby
hadoop02네임노드 상태 - active
● standby -> active 전환 확인하기 (1)
65
RM 이중화
현재 active상태인 hadoop02의 resourcemanager를 강제종료
● standby -> active 전환 확인하기 (2)
66
RM 이중화
대기중이던 hadoop01 resourcemanager
standby - > active 전환 확인
● 정상작동 확인해보기 (1)
67
RM 이중화
현재 상태
active namenode - hadoop02
active resource manager - hadoop01
이 상태에서 hdfs에 파일 업로드 시도
● 정상작동 확인해보기 (2)
68
RM 이중화
● 정상작동 확인해보기 (3)
69
RM 이중화
정상작동 확인
● 종료했던 RM 재실행시 standby 대기 여부 확인
RM을 강제로 종료했던 노드(hadoop01)에서 RM 재실행
70
RM 이중화
/home/hadoop/sbin/yarn-daemon.sh start resourcemanager
active -> kill -> 재실행 -> standby 상태로 대기 확인

More Related Content

What's hot

[234]멀티테넌트 하둡 클러스터 운영 경험기
[234]멀티테넌트 하둡 클러스터 운영 경험기[234]멀티테넌트 하둡 클러스터 운영 경험기
[234]멀티테넌트 하둡 클러스터 운영 경험기NAVER D2
 
MySQL GTID 시작하기
MySQL GTID 시작하기MySQL GTID 시작하기
MySQL GTID 시작하기I Goo Lee
 
Maria db 이중화구성_고민하기
Maria db 이중화구성_고민하기Maria db 이중화구성_고민하기
Maria db 이중화구성_고민하기NeoClova
 
binary log と 2PC と Group Commit
binary log と 2PC と Group Commitbinary log と 2PC と Group Commit
binary log と 2PC と Group CommitTakanori Sejima
 
promgen - prometheus managemnet tool / simpleclient_java hacks @ Prometheus c...
promgen - prometheus managemnet tool / simpleclient_java hacks @ Prometheus c...promgen - prometheus managemnet tool / simpleclient_java hacks @ Prometheus c...
promgen - prometheus managemnet tool / simpleclient_java hacks @ Prometheus c...Tokuhiro Matsuno
 
HTTPを理解する
HTTPを理解するHTTPを理解する
HTTPを理解するIIJ
 
[OpenInfra Days Korea 2018] Day 2 - CEPH 운영자를 위한 Object Storage Performance T...
[OpenInfra Days Korea 2018] Day 2 - CEPH 운영자를 위한 Object Storage Performance T...[OpenInfra Days Korea 2018] Day 2 - CEPH 운영자를 위한 Object Storage Performance T...
[OpenInfra Days Korea 2018] Day 2 - CEPH 운영자를 위한 Object Storage Performance T...OpenStack Korea Community
 
Apache Bigtop3.2 (仮)(Open Source Conference 2022 Online/Hiroshima 発表資料)
Apache Bigtop3.2 (仮)(Open Source Conference 2022 Online/Hiroshima 発表資料)Apache Bigtop3.2 (仮)(Open Source Conference 2022 Online/Hiroshima 発表資料)
Apache Bigtop3.2 (仮)(Open Source Conference 2022 Online/Hiroshima 発表資料)NTT DATA Technology & Innovation
 
TiDBのトランザクション
TiDBのトランザクションTiDBのトランザクション
TiDBのトランザクションAkio Mitobe
 
Keepalived+MaxScale+MariaDB_운영매뉴얼_1.0.docx
Keepalived+MaxScale+MariaDB_운영매뉴얼_1.0.docxKeepalived+MaxScale+MariaDB_운영매뉴얼_1.0.docx
Keepalived+MaxScale+MariaDB_운영매뉴얼_1.0.docxNeoClova
 
UnicodeによるXSSと SQLインジェクションの可能性
UnicodeによるXSSとSQLインジェクションの可能性UnicodeによるXSSとSQLインジェクションの可能性
UnicodeによるXSSと SQLインジェクションの可能性Hiroshi Tokumaru
 
さいきんの InnoDB Adaptive Flushing (仮)
さいきんの InnoDB Adaptive Flushing (仮)さいきんの InnoDB Adaptive Flushing (仮)
さいきんの InnoDB Adaptive Flushing (仮)Takanori Sejima
 
MariaDB Administrator 교육
MariaDB Administrator 교육 MariaDB Administrator 교육
MariaDB Administrator 교육 Sangmo Kim
 
MariaDB Galera Cluster presentation
MariaDB Galera Cluster presentationMariaDB Galera Cluster presentation
MariaDB Galera Cluster presentationFrancisco Gonçalves
 
わかった気になるMySQL
わかった気になるMySQLわかった気になるMySQL
わかった気になるMySQLyoku0825
 
パケットキャプチャの勘どころ Ssmjp 201501
パケットキャプチャの勘どころ Ssmjp 201501パケットキャプチャの勘どころ Ssmjp 201501
パケットキャプチャの勘どころ Ssmjp 201501稔 小林
 
Understanding PostgreSQL LW Locks
Understanding PostgreSQL LW LocksUnderstanding PostgreSQL LW Locks
Understanding PostgreSQL LW LocksJignesh Shah
 
MariaDB 마이그레이션 - 네오클로바
MariaDB 마이그레이션 - 네오클로바MariaDB 마이그레이션 - 네오클로바
MariaDB 마이그레이션 - 네오클로바NeoClova
 
Federated Engine 실무적용사례
Federated Engine 실무적용사례Federated Engine 실무적용사례
Federated Engine 실무적용사례I Goo Lee
 

What's hot (20)

[234]멀티테넌트 하둡 클러스터 운영 경험기
[234]멀티테넌트 하둡 클러스터 운영 경험기[234]멀티테넌트 하둡 클러스터 운영 경험기
[234]멀티테넌트 하둡 클러스터 운영 경험기
 
MySQL GTID 시작하기
MySQL GTID 시작하기MySQL GTID 시작하기
MySQL GTID 시작하기
 
Maria db 이중화구성_고민하기
Maria db 이중화구성_고민하기Maria db 이중화구성_고민하기
Maria db 이중화구성_고민하기
 
Db2 V11 GUIツール
Db2 V11 GUIツールDb2 V11 GUIツール
Db2 V11 GUIツール
 
binary log と 2PC と Group Commit
binary log と 2PC と Group Commitbinary log と 2PC と Group Commit
binary log と 2PC と Group Commit
 
promgen - prometheus managemnet tool / simpleclient_java hacks @ Prometheus c...
promgen - prometheus managemnet tool / simpleclient_java hacks @ Prometheus c...promgen - prometheus managemnet tool / simpleclient_java hacks @ Prometheus c...
promgen - prometheus managemnet tool / simpleclient_java hacks @ Prometheus c...
 
HTTPを理解する
HTTPを理解するHTTPを理解する
HTTPを理解する
 
[OpenInfra Days Korea 2018] Day 2 - CEPH 운영자를 위한 Object Storage Performance T...
[OpenInfra Days Korea 2018] Day 2 - CEPH 운영자를 위한 Object Storage Performance T...[OpenInfra Days Korea 2018] Day 2 - CEPH 운영자를 위한 Object Storage Performance T...
[OpenInfra Days Korea 2018] Day 2 - CEPH 운영자를 위한 Object Storage Performance T...
 
Apache Bigtop3.2 (仮)(Open Source Conference 2022 Online/Hiroshima 発表資料)
Apache Bigtop3.2 (仮)(Open Source Conference 2022 Online/Hiroshima 発表資料)Apache Bigtop3.2 (仮)(Open Source Conference 2022 Online/Hiroshima 発表資料)
Apache Bigtop3.2 (仮)(Open Source Conference 2022 Online/Hiroshima 発表資料)
 
TiDBのトランザクション
TiDBのトランザクションTiDBのトランザクション
TiDBのトランザクション
 
Keepalived+MaxScale+MariaDB_운영매뉴얼_1.0.docx
Keepalived+MaxScale+MariaDB_운영매뉴얼_1.0.docxKeepalived+MaxScale+MariaDB_운영매뉴얼_1.0.docx
Keepalived+MaxScale+MariaDB_운영매뉴얼_1.0.docx
 
UnicodeによるXSSと SQLインジェクションの可能性
UnicodeによるXSSとSQLインジェクションの可能性UnicodeによるXSSとSQLインジェクションの可能性
UnicodeによるXSSと SQLインジェクションの可能性
 
さいきんの InnoDB Adaptive Flushing (仮)
さいきんの InnoDB Adaptive Flushing (仮)さいきんの InnoDB Adaptive Flushing (仮)
さいきんの InnoDB Adaptive Flushing (仮)
 
MariaDB Administrator 교육
MariaDB Administrator 교육 MariaDB Administrator 교육
MariaDB Administrator 교육
 
MariaDB Galera Cluster presentation
MariaDB Galera Cluster presentationMariaDB Galera Cluster presentation
MariaDB Galera Cluster presentation
 
わかった気になるMySQL
わかった気になるMySQLわかった気になるMySQL
わかった気になるMySQL
 
パケットキャプチャの勘どころ Ssmjp 201501
パケットキャプチャの勘どころ Ssmjp 201501パケットキャプチャの勘どころ Ssmjp 201501
パケットキャプチャの勘どころ Ssmjp 201501
 
Understanding PostgreSQL LW Locks
Understanding PostgreSQL LW LocksUnderstanding PostgreSQL LW Locks
Understanding PostgreSQL LW Locks
 
MariaDB 마이그레이션 - 네오클로바
MariaDB 마이그레이션 - 네오클로바MariaDB 마이그레이션 - 네오클로바
MariaDB 마이그레이션 - 네오클로바
 
Federated Engine 실무적용사례
Federated Engine 실무적용사례Federated Engine 실무적용사례
Federated Engine 실무적용사례
 

Similar to 하둡 고가용성(HA) 설정

RHive tutorial supplement 1: RHive 튜토리얼 부록 1 - Hadoop 설치
RHive tutorial supplement 1: RHive 튜토리얼 부록 1 - Hadoop 설치RHive tutorial supplement 1: RHive 튜토리얼 부록 1 - Hadoop 설치
RHive tutorial supplement 1: RHive 튜토리얼 부록 1 - Hadoop 설치Aiden Seonghak Hong
 
[오픈소스컨설팅]Ansible overview
[오픈소스컨설팅]Ansible overview[오픈소스컨설팅]Ansible overview
[오픈소스컨설팅]Ansible overviewOpen Source Consulting
 
하둡완벽가이드 Ch9
하둡완벽가이드 Ch9하둡완벽가이드 Ch9
하둡완벽가이드 Ch9HyeonSeok Choi
 
log-monitoring-architecture.pdf
log-monitoring-architecture.pdflog-monitoring-architecture.pdf
log-monitoring-architecture.pdfSungkyun Kim
 
[1A7]Ansible의이해와활용
[1A7]Ansible의이해와활용[1A7]Ansible의이해와활용
[1A7]Ansible의이해와활용NAVER D2
 
하둡 알아보기(Learn about Hadoop basic), NetApp FAS NFS Connector for Hadoop
하둡 알아보기(Learn about Hadoop basic), NetApp FAS NFS Connector for Hadoop하둡 알아보기(Learn about Hadoop basic), NetApp FAS NFS Connector for Hadoop
하둡 알아보기(Learn about Hadoop basic), NetApp FAS NFS Connector for HadoopSeungYong Baek
 
Java 초보자를 위한 hadoop 설정
Java 초보자를 위한 hadoop 설정Java 초보자를 위한 hadoop 설정
Java 초보자를 위한 hadoop 설정HyeonSeok Choi
 
Hadoop High Availability Summary
Hadoop High Availability SummaryHadoop High Availability Summary
Hadoop High Availability SummaryChan Shik Lim
 
Openstack live migration
Openstack live migrationOpenstack live migration
Openstack live migrationymtech
 
20141029 하둡2.5와 hive설치 및 예제
20141029 하둡2.5와 hive설치 및 예제20141029 하둡2.5와 hive설치 및 예제
20141029 하둡2.5와 hive설치 및 예제Tae Young Lee
 
02.실전! 시스템 관리자를 위한 Ansible
02.실전! 시스템 관리자를 위한 Ansible02.실전! 시스템 관리자를 위한 Ansible
02.실전! 시스템 관리자를 위한 AnsibleOpennaru, inc.
 
Hadoop Introduction (1.0)
Hadoop Introduction (1.0)Hadoop Introduction (1.0)
Hadoop Introduction (1.0)Keeyong Han
 
A review of zookeeper 2010.12
A review of zookeeper 2010.12A review of zookeeper 2010.12
A review of zookeeper 2010.12HoJin Ha
 
제 16회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [하둡메이트 팀] : 하둡 설정 고도화 및 맵리듀스 모니터링
제 16회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [하둡메이트 팀] : 하둡 설정 고도화 및 맵리듀스 모니터링제 16회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [하둡메이트 팀] : 하둡 설정 고도화 및 맵리듀스 모니터링
제 16회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [하둡메이트 팀] : 하둡 설정 고도화 및 맵리듀스 모니터링BOAZ Bigdata
 

Similar to 하둡 고가용성(HA) 설정 (20)

하둡관리
하둡관리하둡관리
하둡관리
 
주키퍼
주키퍼주키퍼
주키퍼
 
RHive tutorial supplement 1: RHive 튜토리얼 부록 1 - Hadoop 설치
RHive tutorial supplement 1: RHive 튜토리얼 부록 1 - Hadoop 설치RHive tutorial supplement 1: RHive 튜토리얼 부록 1 - Hadoop 설치
RHive tutorial supplement 1: RHive 튜토리얼 부록 1 - Hadoop 설치
 
[오픈소스컨설팅]Ansible overview
[오픈소스컨설팅]Ansible overview[오픈소스컨설팅]Ansible overview
[오픈소스컨설팅]Ansible overview
 
HDFS Overview
HDFS OverviewHDFS Overview
HDFS Overview
 
하둡완벽가이드 Ch9
하둡완벽가이드 Ch9하둡완벽가이드 Ch9
하둡완벽가이드 Ch9
 
Kafka slideshare
Kafka   slideshareKafka   slideshare
Kafka slideshare
 
log-monitoring-architecture.pdf
log-monitoring-architecture.pdflog-monitoring-architecture.pdf
log-monitoring-architecture.pdf
 
[1A7]Ansible의이해와활용
[1A7]Ansible의이해와활용[1A7]Ansible의이해와활용
[1A7]Ansible의이해와활용
 
하둡 알아보기(Learn about Hadoop basic), NetApp FAS NFS Connector for Hadoop
하둡 알아보기(Learn about Hadoop basic), NetApp FAS NFS Connector for Hadoop하둡 알아보기(Learn about Hadoop basic), NetApp FAS NFS Connector for Hadoop
하둡 알아보기(Learn about Hadoop basic), NetApp FAS NFS Connector for Hadoop
 
Java 초보자를 위한 hadoop 설정
Java 초보자를 위한 hadoop 설정Java 초보자를 위한 hadoop 설정
Java 초보자를 위한 hadoop 설정
 
03.Ansible 소개
03.Ansible 소개03.Ansible 소개
03.Ansible 소개
 
Hadoop High Availability Summary
Hadoop High Availability SummaryHadoop High Availability Summary
Hadoop High Availability Summary
 
Openstack live migration
Openstack live migrationOpenstack live migration
Openstack live migration
 
20141029 하둡2.5와 hive설치 및 예제
20141029 하둡2.5와 hive설치 및 예제20141029 하둡2.5와 hive설치 및 예제
20141029 하둡2.5와 hive설치 및 예제
 
02.실전! 시스템 관리자를 위한 Ansible
02.실전! 시스템 관리자를 위한 Ansible02.실전! 시스템 관리자를 위한 Ansible
02.실전! 시스템 관리자를 위한 Ansible
 
Hadoop Introduction (1.0)
Hadoop Introduction (1.0)Hadoop Introduction (1.0)
Hadoop Introduction (1.0)
 
A review of zookeeper 2010.12
A review of zookeeper 2010.12A review of zookeeper 2010.12
A review of zookeeper 2010.12
 
Apache hive
Apache hiveApache hive
Apache hive
 
제 16회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [하둡메이트 팀] : 하둡 설정 고도화 및 맵리듀스 모니터링
제 16회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [하둡메이트 팀] : 하둡 설정 고도화 및 맵리듀스 모니터링제 16회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [하둡메이트 팀] : 하둡 설정 고도화 및 맵리듀스 모니터링
제 16회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [하둡메이트 팀] : 하둡 설정 고도화 및 맵리듀스 모니터링
 

하둡 고가용성(HA) 설정

  • 3. HA 개념 (1) 1. HA에서의 주키퍼 주 기능 Failure detection : 네임노드를 감시하여 시스템을 감시한다. Active NameNode election : 네임노드가 죽었을시, 그 다음 네임노드 후보를 선 출한다. 2. ZKFC(zookeeper failover controller) Health monitoring : 상태 모니터링 ZooKeeper session management : 주키퍼의 세션관리 ZooKeeper-based election : 주키퍼 기반 선거(리더선출) 3
  • 4. HA 개념 (2) - 두 개의 네임노드 두 개의 네임노드는 Active 네임 노드, Standby 네임 노드라 부른다. Active네임 노드에 장애가 생기면, 두번째 네임노드인 Stanby 네임 노드가 Active한 상태로 바뀌 면서 네임 노드의 역할을 맡는 방식이다. Active 네임 노드와 Standby 네임 노드는 데이터 노드로 부터 블록 리포트, 하트비트를 모두 받아서 동일한 메타데이터를 유지하고, 저널노드를 이용하여 editFile을 공유한다. 요약하자면, active 네임도느는 네임노드의 역할을 수행하고, standby 네임노드는 active 네임노드 와 동일한 메타데이터 정보를 유지, active 네임노드에 문제가 발생하면 standby 네임노드가 active 네임노드로 동작. active 네임노드에 문제가 발생하는 것을 자동으로 확인하는 것이 어렵기 때문에 주키퍼를 이용, 장애 발생 시 자동으로 상태변경이 가능하도록 한다. 4
  • 5. HA 개념 (3) - 저널 노드 저널 노드 : 네임노드로부터 받은 트랜잭션(edit log)내용을 저널 노드 자신의 로컬 디스크에 저장한다. 해당 edit log 내용은 전체 저널 노드들에 동시에 쓰여진다. 저널노드는 홀수갯수만큼 있는게 좋다. 절반 이상의 저널노드가 동작 중이어야 edit log를 fsimage에 반영할 수 있기 때문. fsimage : 파일시스템에 존재하는 모든 디렉토리와 파일의 아이노드 정보를 직렬화한 파일. 각 아이노드는 파일이나 디렉터리 메타데이터의 내부 구조를 나타내며 파일의 복제 수준, 변경 및 접근 시간, 접근 권한, 블록 크기, 파일을 구성하는 블록 집합과 같은 정보를 가지고 있다. 5
  • 6. HA 개념 (4) - 정리 요약 : 주키퍼는 active name node와 standby name node를 이용한 HA를 가능하게 해주는 분산 코디네이터. 주키퍼는 어떤 노드가 active인지, standby인지를 저장함으로 네임 노드들을 관리한다 주키퍼는 단 하나의 네임 노드만 active상태에 있는 것을 보장. 주키퍼는 평소에 네임노드들과 세션을 유지하고 있다. 만약 active가 반응이 없으면 주키퍼는 바로 standby에게 active의 장애를 알린다. 여러 standby 네임노드가 있다면, 어떤 것을 active name node를 리더로 선출할 지는 주키퍼가 제공하는 리더 선출 기능에 의해 정해진다. 6
  • 7. HA 개념 (5) - 정리 주키퍼는 3대 이상의 홀수 개수 만큼 있는 것이 좋다. 하둡 설정에 의해 주키퍼는 기본적으로 3대가 설정되어 있어야 한다. 네임노드가 두개라고 해서 두개의 주키퍼 서버를 설정하면 오류가 난다. 주키퍼는 하나의 리더와 다수의 팔로워로 구성. 리더가 주키퍼로 들어오는 데이터의 분산을 도맡아 한다. 모든 리더와 팔로워들은 똑같은 데이터를 동기화하고있어 어떤 서버에서 데이터를 읽어도 같은 데이터를 읽을 수 있다. 확실하지 않은 정보 - 주키퍼 서버의 리더선출과, 네임노드서버끼리의 리더선출은 서로 다른 듯? 7
  • 8. 참조 - Fencing(펜싱) Fencing : 네임노드가 장애가 아닌데, 네트워크 문제나, cpu과부하 상황에서 기존의 액티브 네임노드가 죽었다고 판단하여 새로운 네임노드가 active로 승격 될 수 있다. 이때 기존의 네임노드는 아직도 자기가 active라고 생각하는데, 이 상황을 split brain이라고 한다. 이를 방지하기 위해 기존의 액티브 네임노드를 확실하게 죽이는 것을 펜싱(fencing)이라고 한다. 8
  • 10. 네임노드 이중화 - 서비스 구성 계획 10 hadoop ver 3.1.3 zookeeper ver 3.6.3 hostname set hadoop01, hadoop02, hadoop03, hadoop04 all username hadoop01 hadoop01 주키퍼, 액티브 네임노드, 저널노드, 데이터 노드, 노드매니저, 리소스매니저(액티브) hadoop02 주키퍼, 스탠바이 네임노드, 저널노드, 데이 터노드, 노드매니저, 리소스매니저(스탠바이) hadoop03 주키퍼, 저널노드 , 데이터노드, 노드매니저 hadoop04 데이터노드, 노드매니저
  • 11. 네임노드 이중화 시작 전 설정 : 모든 유저네임은 hadoop01로 진행. 모든 노드간 쌍방 키젠 완료 및 authorized_keys에 각자의 공개키 등록된 상태, 자바 설치 완료, 하둡 기본 설치 완료. etc/hosts 설정 11
  • 12. 주키퍼 쿼럼을 형성할 hadoop01~hadoop03에 주키퍼 설치 hadoop01에 설치 후 기본 설정 후에 일괄 배포 예정 권한 주고 압축 풀기 chmod 775 apache-zookeeper-3.6.3-bin.tar.gz tar -xvzf apache-zookeeper-3.6.3-bin.tar.gz 12 네임노드 이중화
  • 13. /home디렉토리에 주키퍼 폴더 생성. 그 하위로 압축 푼 내용 이동 후에 소유권 주기. Sudo mkdir /home/zookeeper Sudo mv /home/hadoop01/Download/apache-zookeeper-3.6.3-bin /home/zookeeper Sudo chown -R hadoop01:hadoop01 zookeeper 13 네임노드 이중화
  • 14. bin : 주키퍼 클라이언트와 서버 실행을 위한 쉘 스크립트 파일 conf : 주키퍼 환경설정을 위한 파일. 샘플파일 복사해서 사용 cp zoo_sample.cfg zoo.cfg vi zoo.cfg 14 네임노드 이중화
  • 15. vi zoo.cfg 수정 : 15 하단에 주키퍼 그룹 정보 추가 입력 네임노드 이중화 dataDir 설정. 후에 주키퍼 실행 시 myid를 읽어 올 디렉토리
  • 16. server.n : 주키퍼 서버 n이 사용하는 주소와 포트 번호를 지정한다 세개의 필드를 가지고 있으며(:로 구분되는) 첫번째 필드는 호스트 이름 또는 IP주소, 두번째와 세번째 필드는 쿼럼 통신과 리더 선출에 사용하는 TCP 포트 번호다. clientPort : 클라이언트가 서버로 연결하기 위해 사용하는 TCP 포트. 기본 포트는 2181이다 dataDir : 인 메모리 데이터베이스의 퍼지 스냅샷이 저장되는 디렉토리. 서버가 주키퍼 앙상블의 구성원이라면 이 디렉토리에 id파일이 존재한다. tickTime : 밀리초 단위로 설정되는 틱 시간이다. 틱은 주키퍼가 사용하는 시간에 대한 기본 측정 단위다. 16 네임노드 이중화
  • 17. 저장 후 모든 주키퍼 서버에 배포 (hadoop01~hadoop03) ● 전송 sudo scp -rp zookeeper hadoop02:/home/ sudo scp -rp zookeeper hadoop03:/home/ ● 권한 부여 ssh root@hadoop02 chown -R hadoop01:hadoop01 /home/zookeeper ssh root@hadoop03 chown -R hadoop01:hadoop01 /home/zookeeper 17 네임노드 이중화
  • 18. 각 서버의 id를 설정해야 한다. conf 파일 내용 1. conf파일에서 지정한 위치(datadir)에 data 디렉토리 생성 2. data 디렉토리에 myid 파일 생성 mkdir /home/zookeeper/data vi myid 18 주키퍼 쿼럼 통신을 위한 포트 리더 선출을 위한 포트 네임노드 이중화 호스트 id
  • 19. 각 호스트에 맞는 서버명 server.n에 해당되는 n을 입력 후 저장 hadoop01 vi /home/zookeeper/data/myid 1 입력 hadoop02 vi /home/zookeeper/data/myid 2 입력 hadoop03 vi /home/zookeeper/data/myid 3 입력 19 네임노드 이중화 echo 1 > myid echo 2 > myid echo 3 > myid hadoop01의 myid파일 예시
  • 20. 편의성을 위한 alias 설정(권장) : vi ~/.bashrc 아래 내용 추가 입력 후 source ~/.bashrc 각 서버에 배포 scp ~/.bashrc hadoop02:~/ scp ~/.bashrc hadoop03:~/ ssh hadoop02 source ~/.bashrc ssh hadoop03 source ~/.bashrc 20 네임노드 이중화
  • 21. 주키퍼 그룹으로 지정한 각 서버(hadoop01~hadoop03)에서 zookeeper-start 명령어로 실행(앞에서 alias설정 시 가능) 21 네임노드 이중화
  • 22. ● 세개의 서버에 모두 실행 후 zookeeper-status로 상태 확인 22 hadoop02가 리더인 상태 네임노드 이중화 hadoop01 hadoop02 hadoop03
  • 23. ● 하둡과 연동 vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh export JAVA_HOME=/usr/local/java export HADOOP_HOME=/home/hadoop/hadoop-3.1.3 export HADOOP_PID_DIR=/home/hadoop/hadoop-3.1.3/pids 23 네임노드 이중화 pid 파일 프로세스의 고유 식별번호! 주로 특정 프로세스의 실행 여부 판단에 사용된다. 이전에 $HADOOP_HOME에 mkdir pids 로 생성했던 디렉토리로 경로 지정 해주었다.
  • 24. ● 기존에 있던 master파일은 사용하지 않는다. workers파일 수정 24 네임노드 이중화
  • 25. ● core-site.xml파일 수정(xml파일은 hadoop01에서 설정 후 일괄 배포) 25 기본 파일시스템 이름 주키퍼 서버 리스트 네임노드 이중화
  • 27. hdfs-site.xml 수정 (2) <property> <name>dfs.namenode.rpc-address.hadoop-cluster.nn1</name> <value>hadoop01:8020</value> </property> <property> <name>dfs.namenode.rpc-address.hadoop-cluster.nn2</name> <value>hadoop02:8020</value> </property> <property> <name>dfs.namenode.http-address.hadoop-cluster.nn1</name> <value>hadoop01:50070</value> </property> <property> <name>dfs.namenode.http-address.hadoop-cluster.nn2</name> <value>hadoop02:50070</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/hadoop-cluster</value> </property> nn1 NameNode의 RPC 포트 nn2 NameNode의 RPC 포트 nn1 NameNode의 Web UI 포트 후에 active, standby 상태를 웹으로 쉽게 확인 할 수 있다. 27 네트워크로부터 떨어져 있는 컴퓨터에서 코드를 실행하는 방식 = 원격 프로시저 콜 (Remote procedure call) nn2 NameNode의 Web UI 포트 NameNode가 edit log를 쓰고 읽을 JournalNode URI URI(Uniform Resource Identifier)는 하나의 리소스를 가리키는 문자열을 칭한다. 가장 흔한 URI는 URL로, 웹 상에서의 위치로 리소스를 식별한다. 네임노드 이중화
  • 28. hdfs-site.xml 수정 (3) <property> <name>dfs.client.failover.proxy.provider.hadoop-cluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/hadoop01/.ssh/id_rsa</value> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> </configuration> NameNode Failover 상황에서 기존 active NameNode를 차단할 때 사용할 방법 지정 HDFS 클라이언트가 active NameNode에 접근할 때 사용되는 Java Class (hdfs에 파일이 올라가지 않는다면 이 설정에 오류가 없는지 의심해보자) ha.fencing.method를 sshfence로 지정했을 경우 ssh를 경유해 기존 active NameNode를 죽이는데, 이때 passphrase를 통과하기 위해 SSH private key file을 지 정해야 함. (이를 위해 미리 keygen 생성을 해놓아야 한다.) 28 자동 장애복구 지정 네임노드 이중화
  • 29. yarn-site.xml 수정 (1) <configuration> <!-- Site specific YARN configuration properties --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property> <name>yarn.nodemanager.local-dirs</name> <value>/home/hadoop/data/yarn/nm-local-dir</value> </property> <property> <name>yarn.resourcemanager.fs.state-store.uri</name> <value>/home/hadoop/data/yarn/system/rmstore</value> </property> <property> 29 네임노드 이중화
  • 30. yarn-site.xml 수정 (2) <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop01</value> </property> <property> <name>yarn.web-proxy.address</name> <value>0.0.0.0:8089</value> </property> </configuration> 프록시 서버(Proxy Server)란 시스템에 방화벽을 가지고 있는 경우 외부와 의 통신을 위해 만들어 놓은 서버. 프록시(Proxy)란 원래 '대리' 라는 의미를 가지고 있음. 프록시 서버는 클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접 적으로 접속할 수 있게 해주는 컴퓨터 30 네임노드 이중화
  • 31. hadoop01에서 설정한 위의 사항들을 hadoop02~hadoop04로 배포 : scp hadoop-env.sh hadoop02:/home/hadoop/hadoop-3.1.3/etc/hadoop/ scp hadoop-env.sh hadoop03:/home/hadoop/hadoop-3.1.3/etc/hadoop/ scp hadoop-env.sh hadoop04:/home/hadoop/hadoop-3.1.3/etc/hadoop/ scp workers hadoop02:/home/hadoop/hadoop-3.1.3/etc/hadoop/ scp workers hadoop03:/home/hadoop/hadoop-3.1.3/etc/hadoop/ scp workers hadoop04:/home/hadoop/hadoop-3.1.3/etc/hadoop/ scp core-site.xml hadoop02:/home/hadoop/hadoop-3.1.3/etc/hadoop/ scp core-site.xml hadoop03:/home/hadoop/hadoop-3.1.3/etc/hadoop/ scp core-site.xml hadoop04:/home/hadoop/hadoop-3.1.3/etc/hadoop/ scp hdfs-site.xml hadoop02:/home/hadoop/hadoop-3.1.3/etc/hadoop/ scp hdfs-site.xml hadoop03:/home/hadoop/hadoop-3.1.3/etc/hadoop/ scp hdfs-site.xml hadoop04:/home/hadoop/hadoop-3.1.3/etc/hadoop/ scp yarn-site.xml hadoop02:/home/hadoop/hadoop-3.1.3/etc/hadoop/ scp yarn-site.xml hadoop03:/home/hadoop/hadoop-3.1.3/etc/hadoop/ scp yarn-site.xml hadoop04:/home/hadoop/hadoop-3.1.3/etc/hadoop/ 31 네임노드 이중화
  • 32. 하둡 HA 실행 순서 : 1. 주키퍼 포맷 2. 3개의 저널노드 실행 3. Active 네임노드 실행 4. Standby 네임노드 실행 5. 주키퍼 장애 컨트롤러 (zkfc)실행 6. 데이터노드 실행 7. 얀 클러스터 실행 8. 히스토리서버 실행 32 네임노드 이중화
  • 33. 편리한 실행을 위한 alias 등록 : vi ~/.bashrc alias hadoop="~/hadoop/sbin/hadoop-daemon.sh" alias hdfs="~/hadoop/bin/hdfs" alias yarn="~/hadoop/bin/yarn" source ~/.bashrc 후에 타 서버 배포 후 환경변수 활성화 33 네임노드 이중화
  • 34. 34 주키퍼 포맷 : hdfs zkfc -formatZK hadoop01~hadoop03에서 주키퍼가 실행 된 상태여야 한다 네임노드 이중화
  • 35. 저널노드 실행 : 이제 hadoop01부터 hadoop03까지 저널노드를 설정한 기기들에서 각각 저널노드를 시작해준다. 위 의 .bashrc파일을 각 기기에 설정해주었다면 아래의 커맨드로 실행이 가능 hadoop start journalnode hadoop01 ~ hadoop03 까지 반복 실행 후 jps : 주키퍼 저널 노드 35 네임노드 이중화
  • 36. hadoop01에서 hdfs 포맷 : hdfs namenode -format (네임노드 포맷은 신중히! 처음 실행시에는 포맷 필수) 36 네임노드 이중화
  • 37. 액티브 네임노드 실행 : hadoop01에서 hadoop start namenode 37 네임노드 이중화
  • 38. hadoop02에서 스탠바이 네임노드 실행 준비 : hadoop02에서 hdfs namenode -bootstrapStandby 명령어로 active네임노드의 메타데이터를 복사해온다. 정상 작동 시 아래 내용 출력. 38 네임노드 이중화
  • 39. 오류 - a shared edits dir must not be specified if HA is not enabled. (1) 현상 - 스탠바이 네임노드가 액티브 네임노드의 메타데이터 복사에 실패 확인해보니 복사해야 할 hadoop01 의 네임노드가 죽어있는 상태 39
  • 40. 원인 파악 및 해결 - hadoop01의 네임노드 로그확인 a shared edits dir must not be specified if HA is not enabled. HA에 관한 오류인 듯 HA를 설정한 hdfs-site.xml확인. 오타 발견, 수정 후 재실행. 네임노드 정상 실행 확인 40 오류 - a shared edits dir must not be specified if HA is not enabled. (2)
  • 41. 오류 - journal at hadoop01 has no edit logs (1) hdfs namenode -bootstrabStandby 입력 후 다른 오류가 발생했다. 41 active Namenode는 정상실행 됐지만 다른 문제가 발생 journal at hadoop01 has no edit logs
  • 42. 해결 로그 확인해보니 이전 데이터와 충돌된 듯한 느낌. 이전에 있던 저널노드데이터 삭제. 네임노드 데이터 삭제. 포맷 후에 재실행. 42 극단적인 방법이긴 했지만, 정상작동 확인 오류 - journal at hadoop01 has no edit logs (2)
  • 43. 오류 - FSIamageSaver clean checkpoint: shutdown (1) 현상 - 스탠바이 네임노드가 액티브 네임노드의 메타데이터 복사에 실패 43 저널노드 키고, 액티브 네임노드 키고, 스탠바이 네임노드에서 bootstrapStandby 입력하니 에러.. 네임노드 로그 확인 fsimage에 문제가 있는듯
  • 44. 원인 파악 44 검색 결과 standby namenode and journal node configurations were in a corrupted state, so that when the cluster tried to switch to the standby, you encountered the error that you reported. Initially we have to put the primary namenode into safemode and saved the namespace with the following commands: hdfs dfsadmin -safemode enter hdfs dfsadmin -saveNamespace su - hdfs -c "hdfs namenode -bootstrapStandby -force" this was to make sure that the namenode was in a consistent state before we attempted to restart the HDFS components one last time to make sure all processes started cleanly and that HDFS would automatically leave safemode - 위 내용을 바탕으로 예상한 원인 이전에 네임노드 이중화 실험을 위해 active네임노드를 강제적으로 죽여서 standby네임노드가 active로 된 상태에서 종료했었다. 이 때 마지막 액티브 네임노드였던 hadoop02에서 실행을 했어 야 했는데 standby였던 hadoop01에서 실행, hadoop02에서 active노드 메타데이터 복사 요청으로 인해 오류가 난 듯 하다. hadoop01, hadoop02 네임노드 모두 실행 후 마지막 액티브 네임노드였던 hadoop02에서 오류 해결 시도 오류 - FSIamageSaver clean checkpoint: shutdown (2)
  • 45. 해결 - safemode 사용 namespace 저장 45 일단 hadoop01, hadoop02 네임노드 둘다 키고, 마지막 액티브 네임노드였던 hadoop02에서 진행 hdfs dfsadmin -safemode enter hdfs dfsadmin -saveNamespace hdfs dfsadmin -safemode leave 오류 - FSIamageSaver clean checkpoint: shutdown (3)
  • 46. 해결 - safemode 사용 namespace 저장 46 현재 실행중이던 스탠바이 네임노드 종료 후 hdfs namenode -bootstrapStandby -force 입력 정상 완료. 이후에 다시 스탠바이 네임노드 시작 생각보다 자주 발생하는 오류였다. 오류 - FSIamageSaver clean checkpoint: shutdown (4)
  • 47. hadoop02에서 스탠바이 네임노드 실행 : hadoop start namenode 47 네임노드 이중화
  • 48. alias 추가 설정 : vi ~/.bashrc 입력 후 source ~/.bashrc 48 네임노드 이중화
  • 49. ● 데이터노드 실행 hadoop01~hadoop04 모두 실행 hadoop start datanode ● yarn 실행 hadoop01에서 실행 yarn-start ● historyserver 실행 hadoop01, hadoop02에서 실행 49 네임노드 이중화
  • 50. ● 주키퍼 장애 컨트롤러 실행 hadoop01, hadoop02 네임노드들에서 실행 hadoop start zkfc (zookeeper failover controller) 50 네임노드 이중화
  • 51. 오류 - you must configure a fencing method before using automatic failover. 원인 및 해결 - 단순 오타 ssfence가 아니라 sshfence를 입력 해야 한다. hdfs-site.xml에서 수정 후 문제 해결 51
  • 52. 오류 - 두 개의 네임노드 모두 standby 상태 해결 - zkFC 실행 시 하나가 active로 전환된다. 52 zkfc를 실행했어도 active 전환이 안된다면 네임노드 설정과 주키퍼 앙상블 설정 재확인
  • 53. ● 실행 완료 확인 hadoop01 hadoop02 hadoop04 hadoop03 53 네임노드 이중화
  • 54. ● zkfc 작동 확인 먼저 active, standby 네임노드의 상태를 웹에서 확인해보자 이 상태에서 hadoop01의 네임노드를 강제로 종료 했을 때 hadoop02의 standby 상태가 active상태로 바뀌면 성공 54 네임노드 이중화
  • 55. ● active 네임노드 kill 액티브 네임노드(hadoop01) kill 12211 hadoop02 standby -> active 전환 확인 55 네임노드 이중화
  • 56. ● standby 네임노드의 로그 확인 56 네임노드 이중화 standby -> active로 전환 확인
  • 57. ● 기존 네임노드가 kill 된 상태에서 hadoop02 정상작동 확인. 57 네임노드 이중화 hadoop02(현재 active namenode)에서 진행 hdfs dfs -cat /README.txt 이중화 완료.
  • 58. 2. 리소스 매니저 이중화 58
  • 59. RM 이중화(HA)는 네임노드 이중화(HA)와 유사하게 active/standby로 구성되 며 Zookeeper를 이용하는 방식. 네임노드 이중화와 달리 RM 이중화(HA)는 별도의 모니터링 프로세스가 필 요없이 내장되어 있는 Zookeeper 기반의 ActiveStandbyElector가 active 여 부를 결정한다. 59 RM 이중화 - 개념
  • 60. ● yarn-site.xml에 추가 입력(1) <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> <property> <name>yarn.resourcemanager.zk-address</name> <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value> </property> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> 60 RM 이중화 ResourceManager 시작시 state 복구여부 persistent store로 사용할 class Zookeeper 서버 리스트 ResourceManager HA 사용여부
  • 61. ● yarn-site.xml에 추가 입력(2) <property> <name>yarn.resourcemanager.cluster-id</name> <value>rm-cluster</value> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>hadoop01</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>hadoop02</value> </property> 61 RM 이중화 ResourceManager가 leader election에 참가할 cluster 이름 지정 cluster에서 HA를 구성할 ResourceManager id 지정 rm1의 호스트명 rm2의 호스트명
  • 62. ● 입력 후 다른 노드들에 배포 62 RM 이중화
  • 63. ● 실행 1. 액티브 네임노드 실행 2. 스탠바이 네임노드 실행 3. 데이터 노드 실행 4. 액티브 리소스매니저 실행(hadoop01에서 yarn-start) 5. 스탠바이 리소스매니저 실행(hadoop02에서 yarn-start) 6. 주키퍼 장애 컨트롤러 실행 63 RM 이중화
  • 64. ● RM 상태 확인 /home/hadoop/bin/yarn rmadmin -getServiceState rm1 /home/hadoop/bin/yarn rmadmin -getServiceState rm2 64 RM 이중화 hadoop01 리소스매니저 - standby 상태 hadoop02 리소스매니저 - active 상태 hadoop01 네임노드 상태 - standby hadoop02네임노드 상태 - active
  • 65. ● standby -> active 전환 확인하기 (1) 65 RM 이중화 현재 active상태인 hadoop02의 resourcemanager를 강제종료
  • 66. ● standby -> active 전환 확인하기 (2) 66 RM 이중화 대기중이던 hadoop01 resourcemanager standby - > active 전환 확인
  • 67. ● 정상작동 확인해보기 (1) 67 RM 이중화 현재 상태 active namenode - hadoop02 active resource manager - hadoop01 이 상태에서 hdfs에 파일 업로드 시도
  • 68. ● 정상작동 확인해보기 (2) 68 RM 이중화
  • 69. ● 정상작동 확인해보기 (3) 69 RM 이중화 정상작동 확인
  • 70. ● 종료했던 RM 재실행시 standby 대기 여부 확인 RM을 강제로 종료했던 노드(hadoop01)에서 RM 재실행 70 RM 이중화 /home/hadoop/sbin/yarn-daemon.sh start resourcemanager active -> kill -> 재실행 -> standby 상태로 대기 확인