1..1HDFS 하 배경
HDFS 클러스터의 NameNode 에는 SPOF (단일 장애 지점) 가 있습니다. 하나의 NameNode 만 있는 클러스터의 경우 NameNode 시스템에 문제가 발생하면 NameNode 가 재시작될 때까지 전체 클러스터를 사용할 수 없습니다.
HDFS 클러스터를 사용할 수 없는 경우는 주로 두 가지가 있습니다. 하나는 NameNode 시스템 가동 중지로 클러스터를 사용할 수 없게 되고, NameNode 를 다시 시작해야 사용할 수 있습니다. 둘째, NameNode 의 소프트웨어 또는 하드웨어 업그레이드 계획으로 인해 클러스터를 단기간에 사용할 수 없게 됩니다.
이러한 문제를 해결하기 위해 Hadoop 은 고가용성 HDFS HA 시나리오를 제공합니다. HDFS 는 일반적으로 두 개의 NameNode 로 구성되며 하나는 활성 상태이며 다른 하나는 대기 상태입니다. 활성 NameNode 는 클라이언트의 RPC 요청 처리와 같은 외부 서비스를 제공하는 반면 대기 NameNode 는 외부 서비스를 제공하지 않습니다. 다만 활성 NameNode 의 상태를 동기화하여 실패 시 신속하게 전환할 수 있습니다.
1.2 HDFS HA 아키텍처
일반적인 HA 클러스터 NameNode 는 별도의 두 시스템에 구성됩니다. 언제든지 한 NameNode 는 활성 상태이고 다른 NameNode 는 백업 상태입니다. 활성 NameNode 는 클러스터의 모든 클라이언트에 응답하고 백업 NameNode 는 필요할 때 신속한 전송을 위해 복제본으로만 사용됩니다.
대기 노드와 활성 노드를 동기화하기 위해 두 노드 모두 JNS 라는 독립적인 프로세스 세트를 사용하여 로그 노드를 유지합니다. 활성 노드에서 네임스페이스를 업데이트할 때 레코드 수정 로그를 대부분의 JNS 로 보냅니다. 대기 노드는 JNS 에서 이러한 편집 내용을 읽고 로그 변경 사항에 초점을 맞춥니다. 대기 노드는 로그 변경 사항을 자체 네임스페이스에 적용합니다. 장애 조치가 발생하면 대기 서버는 자체적으로 활성 서버로 승격되기 전에 모든 편집 내용을 JNS 에서 읽을 수 있도록 합니다. 즉, 장애 조치가 발생하기 전에 대기 서버가 보유한 네임스페이스가 활성 서버와 완전히 동기화되어야 합니다.
신속한 페일오버를 지원하기 위해 대기 노드는 클러스터에서 데이터 블록의 최신 위치를 저장해야 합니다. 이를 위해 데이터 노드는 두 DataNodes 의 주소를 동시에 구성하고 하트비트 링크를 설정한 다음 블록 위치를 전송해야 합니다.
한 번에 하나의 활성 NameNode 만 있는 것이 중요합니다. 그렇지 않으면 클러스터 운영이 혼란스러워지고 두 개의 NameNode 가 두 가지 다른 데이터 상태를 가지며 데이터 손실이나 상태 예외가 발생할 수 있습니다. 이를 "균열 뇌" 라고 합니다 (3 노드 통신이 차단됨, 즉 클러스터의 다른 데이터 노드가 두 개의 활성 Datanodes 를 볼 수 있음). JNS 의 경우 한 명의 NameNode 만 작성자로 허용됩니다. 언제 든 지; 장애 조치 중 원래 대기 노드는 활성 노드의 모든 기능을 인수하고 JNS 에 로깅을 기록하여 다른 NameNode 가 활성 노드가 되지 않도록 합니다.
QJM 기반 HDFS HA 시나리오는 위의 그림과 같이 처리 프로세스가 다음과 같습니다. 클러스터가 시작된 후 NameNode 가 활성 상태이며 클라이언트 및 DataNode 요청을 처리하고 editlog 를 로컬 및 공유 editlog (QJM) 에 기록합니다. 다른 NameNode 는 대기 중입니다. 시작 시 fsimage 를 로드한 다음 공유 편집 로그에서 정기적으로 편집 로그를 가져와 활성 노드의 상태와 동기화됩니다. Active 끊기 후 Standby 의 빠른 서비스를 구현하기 위해 DataNode 는 두 NameNode 에 동시에 보고해야 Stadnby 가 block 의 정보를 DataNode 에 저장할 수 있습니다. NameNode 시작에 가장 많은 시간이 소요되는 작업은 모든 DataNode 의 blockreport 를 처리하는 것이기 때문입니다 핫 스페어를 확보하기 위해 장애 컨트롤러 및 Zookeeper 가 추가되고 장애 컨트롤러가 Zookeeper 와 통신합니다. FailoverController 는 Zookeeper 선거 메커니즘을 통해 RPC 를 통해 NameNode 를 활성 또는 대기 상태로 전환했습니다.
1.3 HDFS 고가용성 구성 요소
NameNode 시스템: 각각 활성 노드와 대기 노드를 실행하는 동일한 구성의 물리적 시스템 두 대.
JouralNode 시스템: JouralNode 를 실행하는 시스템입니다. JouralNode 데몬은 매우 경량이며 NameNode, DataNode, ResourceManager 등과 같은 다른 Hadoop 프로세스와 함께 배포할 수 있습니다. 이 중 적어도 세 개는 홀수입니다. N JNS 를 실행하면 작업에 영향을 주지 않고 (N- 1)/2 개의 JNS 프로세스가 실패하도록 허용할 수 있습니다.
HA 클러스터에서 대기 Namenode 도 네임스페이스에서 체크포인트 작업 (백업 NameNode 의 특성 상속) 을 수행하므로 HA 클러스터에서 SecondaryNameNode, CheckpointNode 또는 BackupNode 를 실행할 필요가 없습니다.
1.4 HDFS 고가용성 구성 매개 변수
Hdfs.xml 에서 다음 매개 변수를 구성해야 합니다.
DFS. name services:hdf snn 의 논리적 이름입니다 (예: myhdfs).
Dfs.ha.namenodes.myhdfs: 지정된 서비스 논리 이름 myhdfs 가 있는 노드 목록 (예: nn 1 및 nn2).
Dfs.namenode.RPC-address.myh dfs.nn 1: my HDFS 에 있는 외부 서비스의 nn1에 대한 RPC 주소입니다.
Dfs.namenode.work-scripts/ifcfg-eth0
//네트워크 서비스 다시 시작
# 서비스 네트워크 재시작
//호스트 이름 수정
# hostnamectl set-hostname 호스트 이름
//호스트 이름 보기
# hostnamectl 상태
3.3 IP 주소와 호스트 이름 간의 매핑 설정
//루트 사용자 전환
$ su 루트
//호스트 파일 편집
# vim /etc/hosts
172.16.20.81
172. 16.20.82
Hadoop-slave 1
172.16.20.84hadoop-slave2
172.16.20.85 Hadoop-slave 3
3.4 방화벽 및 Selinux 종료
//루트 사용자 전환
$ su 루트
//방화벽 방화벽 중지
# systemctl 방화벽 d.service 중지
//방화벽 시작을 금지합니다.
# systemctl 방화벽 d.service 비활성화
//Selinux 켜기 및 끄기
# vim /etc/selinux/config
SELINUX = 비활성화
//시스템을 재부팅한 후 루트 사용자는 Selinux 상태를 확인합니다.
# getenforce
3.5 SSH 구성 비밀번호 없이 로그인
//hadoop-master 1 노드에 SSH 키 쌍을 생성합니다.
$ ssh-keygen -t RSA
//공개 키를 클러스터의 모든 노드 시스템에 복사합니다.
$ ssh-copy-id Hadoop-master1
$ ssh-copy-id hadoop-master2
$ ssh-copy-id Hadoop-slave1
$ ssh-copy-id hadoop-slave2
$ ssh-copy-id hadoop-slave3
//ssh 를 통해 각 노드에 로그인하여 비밀번호가 없는 로그인이 성공했는지 테스트합니다.
$ sshhadoop-마스터 2
주: 다른 노드에서도 동일한 작업을 수행하여 클러스터의 모든 노드가 비밀번호 없이 ssh 를 통해 다른 노드에 로그인할 수 있도록 합니다.
3.6 JDK 설치
//시스템과 함께 제공된 openjdk 를 제거합니다.
$ su 루트
# rpm-qa | grep Java
# rpm-e-nodeps Java-1.7.0-open JDK-1.7.0.75-2.5
# rpm-e-nodeps Java-1.7.0-open JDK-headless-1.7.0.75
# rpm-e-nodeps tz data-Java-2015a-1.el7 _ 0.noarch
# 종료
//JDK 설치 패키지 압축 풀기
$ tar-xvfjdk-7u79-Linux-x64.tar.gz
//설치 패키지를 삭제합니다
$ rmjdk-7u79-linux-x64.tar.gz
//사용자 환경 변수 수정
$ CD ~
$ vim.bash_profile
Export Java _ home =/home/Hadoop/app/JDK1.7.0 _ 79
Exportpath = $ path: $ Java _ home/bin
//수정된 환경 변수 적용
$ source.bash_profile
//JDK 가 성공적으로 설치되었는지 테스트합니다.
$ Java 버전
4 클러스터 시간 동기화
클러스터 노드의 시간이 동기화되지 않으면 노드 다운타임이나 기타 비정상적인 문제가 발생할 수 있으므로 클러스터 시간 동기화는 일반적으로 운영 환경에 NTP 서버를 구성하여 수행됩니다. 클러스터에서 NTP 서버는 다음과 같이 hadoop-master 1 노드에 설정됩니다.
//루트 사용자 전환
$ su 루트
//NTP 가 설치되어 있는지 확인합니다.
# rpm -qa | grep NTP
//NTP 설치
# yum install -y NTP
//시간 서버 구성
# vim /etc/ntp.conf
# 모든 시스템이 NTP 서버에 연결하지 못하도록 합니다
기본 무시 제한
# LAN 의 모든 시스템을 NTP 서버에 연결할 수 있습니다.
제한 172. 16.20.0 차폐 255.255.255.0 수정 없음 트랩 없음
# 이 시스템을 시간 서버로 사용
서버127.127.1.0
//NTP 서버 시작
# 서비스 ntpd 시작
//NTP 서버가 자동으로 시작되도록 설정합니다.
# chkconfig ntpd 열기
클러스터의 다른 노드는 crontab 스케줄 지정 작업을 수행하여 매일 지정된 시간에 NTP 서버와 시간을 동기화합니다. 이 방법은 다음과 같습니다.
//루트 사용자 전환
$ su 루트
//매일 00:00 시에 서버와 시간을 동기화하고 로그를 쓰는 예약된 작업을 수행합니다.
# crontab -e
0? 0? *? *? *? /usr/sbin/NTP date Hadoop-master1> & gt/home/hadoop/ntpd.log
//작업 보기
# crontab -l
5 Zookeeper 클러스터 설치
Zookeeper 는 고유한 Leader-Follower 클러스터 구조가 분산된 단일 지점 문제를 잘 해결하는 오픈 소스 분산 조정 서비스입니다. 현재 통합 이름 지정 서비스, 구성 관리, 잠금 서비스, 클러스터 관리 등의 시나리오에 주로 적용됩니다. Zookeeper 의 클러스터 관리 기능은 주로 대용량 데이터 어플리케이션에 사용됩니다.
이 클러스터는 zookeeper-3.4.5-CDH 5.7.1버전을 사용합니다. 먼저 다음과 같이 hadoop-slave 1 노드에 Zookeeper 를 설치합니다.
//새 디렉토리 만들기
$ mkdir 애플리케이션 /cdh
//zookeeper 설치 패키지 압축 풀기
$ tar-xvf zookeeper-3.4.5-CD h5.7.1.tar.gz-c app/CDH/
//설치 패키지를 삭제합니다
$ RM-RF zookeeper-3.4.5-CD h5.7.1.tar.gz
//사용자 환경 변수 구성
$ vim. Bash_profile
내보내기 zookeeper _ home =/home/Hadoop/app/CDH/zookeeper-3.4.5-CDH 5.7./kloc-0
익스포트 경로 =$PATH:$ZOOKEEPER_HOME/bin
//수정된 환경 변수 적용
$ source.bash_profile
//zookeeper 구성 파일 수정
$ cdapp/CDH/zookeeper-3.4.5-cdh5.7.1/conf/
$ CP zoo_sample.cfg zoo.cfg
$ vim zoo.cfg
# 클라이언트 하트비트 시간 (밀리초)
발권 시간 =2000
# 최대 허용 하트비트 간격
InitLimit= 10
# 동기화 시간 제한
SyncLimit=5
# 데이터 저장소 디렉토리
Datadir =/home/Hadoop/app/CDH/zookeeper-3.4.5-CDH 5.7.1/data
# 데이터 로그 저장소 디렉토리
Data logdir =/home/Hadoop/app/CDH/zookeeper-3.4.5-CDH 5.7.1/data
# 포트 번호
클라이언트 포트 =2 18 1
# 클러스터 노드 및 서비스 포트 구성
Server.1= Hadoop-slave1:2888: 3888
Server.2 = Hadoop-slave2: 2888: 3888
Server.3 = Hadoop-slave 3: 2888: 3888
# 다음은 최적화된 구성입니다
# 기본적으로 서버의 최대 연결 수는 10 이며 0 은 제한이 없음을 의미합니다.
MaxClientCnxns=0
# 스냅샷 수
Autopurge.snapRetainCount=3
# 스냅샷 정리 시간, 기본값은 0 입니다.
Autopurge.purgeinterval =1
//zookeeper 의 데이터 저장소 디렉토리 및 로그 저장소 디렉토리를 만듭니다.
$ CD .....
$ mkdir -p 데이터/로그
//데이터 디렉토리에 1 을 입력하여 myid 파일을 만듭니다.
$ echo "1" >& gt 데이터/내 id
//zookeeper 의 로그 출력 경로 수정 (CDH 버전과 기본 버전 구성 파일이 다름)
$ vim libexec/zkEnv.sh
If ["x${ZOO_LOG_DIR}" = "x"]
그리고 나서
Zoo _ log _ dir = "$ zookeeper _ home/logs"
선측은 화물 적재 비용을 부담하지 않습니다
If ["x${ZOO_LOG4J_PROP}" = "x"]
그리고 나서
ZOO_LOG4J_PROP="INFO, ROLLINGFILE "
선측은 화물 적재 비용을 부담하지 않습니다
//zookeeper 로그 구성 파일을 수정합니다.
$ vim conf/log4j.properties
Zookeeper.root.logger=INFO, ROLLINGFILE
//로그 디렉토리 만들기
$ mkdir 로그
Hadoop-slave 1 노드의 Zookeeper 디렉토리를 hadoop-slave2 및 hadoop-slave3 노드와 동기화하고 Zookeeper 의 데이터 파일을 수정합니다. 또한 사용자 환경 변수를 설정하는 것을 잊지 마십시오.
//zookeeper 디렉토리를 hadoop-slave 1 의 다른 노드로 복사합니다.
$ CD ~
$ scp-rapp/CDH/zookeeper-3.4.5-CD h5.7.1Hadoop-slave2:/home/
$ scp-rapp/CDH/zookeeper-3.4.5-CD h5.7.1Hadoop-slave3:/home/
//hadoop-slave2 의 데이터 디렉토리에 있는 myid 파일을 수정합니다.
$ echo "2" > app/CDH/zookeeper-3.4.5-CD h5.7.1/data/myid
//hadoop-slave3 의 데이터 디렉토리에 있는 myid 파일을 수정합니다.
$ echo "3" > app/CDH/zookeeper-3.4.5-CD h5.7.1/data/myid
마지막으로 Zookeeper 가 설치된 각 노드에서 Zookeeper 를 시작하고 노드 상태를 확인합니다. 이 방법은 다음과 같습니다.
//시작
$ zkServer.sh start
//상태 보기
$ zkServer.sh 상태
//닫기