ZooKeeper 기반 Hadoop 고 사용 가능 한 클 러 스 터 를 구축 하 는 튜 토리 얼 도해

17305 단어 ZooKeeperHadoop군집
1.고가 용 안내
Hadoop 고가 용(High Availability)은 HDFS 고가 용 과 YARN 고가 용 으로 나 뉘 는데 이들 의 실현 은 기본적으로 유사 하지만 HDFS NameNode 는 데이터 저장 과 그 일치 성에 대한 요구 가 YARN Resource Manger 보다 훨씬 높 기 때문에 그 실현 도 더욱 복잡 하기 때문에 다음 과 같이 설명 한다.
1.1 고가 용 전체 구조
HDFS 고가 용 구 조 는 다음 과 같다.

사진 참조:https://www.edureka.co/blog/how-to-set-up-hadoop-cluster-with-hdfs-high-availability/
HDFS 고가 용 구 조 는 주로 다음 과 같은 구성 요소 로 구성 된다.
Active NameNode 와 Standby NameNode:두 대의 NameNode 가 서로 준비 되 고 한 대 는 Active 상태 에 있 으 며 주 NameNode 이 고 다른 한 대 는 Standby 상태 에 있 으 며 NameNode 에 대비 하여 주 NameNode 만 대외 적 으로 읽 기와 쓰기 서 비 스 를 제공 할 수 있 습 니 다.
  • 메 인 스 위칭 컨트롤 러 ZKFailover Controller:ZKFailover Controller 는 독립 된 프로 세 스 로 실행 되 고 NameNode 의 메 인 스 위칭 을 전체적으로 제어 합 니 다.ZKFailover Controller 는 NameNode 의 건강 상 태 를 신속하게 감지 할 수 있 습 니 다.주 NameNode 가 고장 났 을 때 Zookeeper 를 통 해 자동 으로 예비 선거 와 전환 을 실현 할 수 있 습 니 다.물론 NameNode 는 현재 Zookeeper 에 의존 하지 않 는 수 동 메 인 전환 도 지원 합 니 다.
  • Zookeeper 군집:주요 전환 컨트롤 러 는 주요 선거 지원 을 제공 합 니 다.공유 저장 시스템:공유 저장 시스템 은 NameNode 를 실현 하 는 가장 중요 한 부분 으로 공유 저장 시스템 은 NameNode 가 실행 과정 에서 발생 하 는 HDFS 의 메타 데 이 터 를 저장 합 니 다.
  • 주 NameNode 와 NameNode 는 공유 저장 시스템 을 통 해 메타 데 이 터 를 동기 화 합 니 다.메 인 전환 을 진행 할 때 새로운 메 인 네 임 노드 는 메타 데이터 가 완전히 동기 화 되 었 는 지 확인 한 후에 야 대외 서 비 스 를 계속 제공 할 수 있 습 니 다.
  • DataNode 노드:공유 메모리 시스템 을 통 해 HDFS 의 메타 데이터 정 보 를 공유 하 는 것 외 에 주 NameNode 와 예비 NameNode 는 HDFS 의 데이터 블록 과 DataNode 간 의 매 핑 관 계 를 공유 해 야 합 니 다.
  • DataNode 는 주 NameNode 와 예비 NameNode 에 데이터 블록의 위치 정 보 를 동시에 보고 합 니 다.
  • 1.2 QJM 기반 공유 저장 시스템 의 데이터 동기 화 메커니즘 분석
    현재 Hadoop 은 Quorum Journal Manager(QJM)나 Network File System(NFS)을 공유 하 는 저장 시스템 으로 사용 할 수 있 습 니 다.QJM 클 러 스 터 를 예 로 들 어 설명 합 니 다.Active NameNode 는 먼저 EditLog 를 JournalNode 클 러 스 터 에 제출 한 다음 Standby NameNode 에서 JournalNode 클 러 스 터 에서 정시 에 EditLog 를 동기 화 합 니 다.Active NameNode 가 다운 되면...Standby NameNode 는 메타 데이터 가 완전히 동기 화 되 었 는 지 확인 한 후에 대외 적 으로 서 비 스 를 제공 할 수 있다.
    설명 이 필요 한 것 은 JournalNode 클 러 스 터 에 EditLog 를 기록 하 는 것 은'절반 이상 쓰 면 성공 합 니 다'라 는 전략 을 따 르 기 때문에 적어도 3 개의 JournalNode 노드 가 있어 야 합 니 다.물론 노드 수 를 계속 늘 릴 수도 있 지만 노드 총수 가 홀수 라 는 것 을 보증 해 야 합 니 다.아울러 2N+1 대의 JournalNode 가 있다 면 과반 작성 원칙 에 따라 최대 N 대의 JournalNode 노드 가 끊 어 지 는 것 을 용인 할 수 있다.

    1.3 NameNode 메 인 스 위칭
    NameNode 가 주 전환 을 실현 하 는 프로 세 스 아래 그림:

    HealthMonitor 초기 화가 완료 되면 NameNode 에 대응 하 는 HAServiceProtocol RPC 인 터 페 이 스 를 주기 적 으로 호출 하 는 내부 스 레 드 를 시작 하여 NameNode 의 건강 상 태 를 검사 합 니 다.
    헬 스 모니터 는 네 임 노드 의 건강 상태 변화 가 감지 되면 ZKFailoverController 등록 에 해당 하 는 방법 으로 되 돌려 처리한다.
    ZKFailover Controller 가 주 된 전환 이 필요 하 다 고 판단 하면 먼저 ActiveStandby Elector 를 사용 하여 자동 주 된 선 거 를 실시 합 니 다.
    ActiveStandby Elector 와 Zookeeper 가 상호작용 을 하여 자동 예비 선 거 를 완성 합 니 다.
    ActiveStandby Elector 는 주 선거 가 완료 되면 ZKFailover Controller 의 해당 방법 으로 현재 NameNode 를 주 NameNode 또는 예비 NameNode 로 알 립 니 다.
    ZKFailoverController 는 NameNode 에 대응 하 는 HAServiceProtocol RPC 인 터 페 이 스 를 호출 하 는 방법 으로 NameNode 를 Active 상태 나 Standby 상태 로 변환 합 니 다.
    1.4 YARN 고가 용
    YARN ResourceManager 의 높 은 사용 가능성 은 HDFS NameNode 의 높 은 사용 가능성 과 유사 하지만,ResourceManager 는 NameNode 와 달리 유지 해 야 할 메타 데이터 정보 가 많 지 않 기 때문에 상태 정 보 는 Zookeeper 에 직접 쓰 고 Zookeeper 에 의존 하여 예비 선 거 를 진행 할 수 있 습 니 다.

    2.군집 계획
    높 은 사용 가능 한 디자인 목표 에 따라 최소한 두 개의 NameNode(주 1 비)와 두 개의 ResourceManager(주 1 비)가 있어 야 하 며,동시에'과반수 기록 하면 성공'의 원칙 을 만족 시 키 기 위해 서 는 최소 3 개의 JournalNode 노드 가 필요 합 니 다.여기 서 세 대의 호스트 를 사용 하여 구축 합 니 다.클 러 스 터 계획 은 다음 과 같 습 니 다.

    3.선행 조건 은 모든 서버 에 JDK 가 설치 되 어 있 고 설치 절 차 는 다음 과 같다.Linux 에서 JDK 설치ZooKeeper 클 러 스 터 를 구축 하고 구축 절 차 는 참조 할 수 있 습 니 다.Zookeeper 단기 환경 과 클 러 스 터 환경 구축모든 서버 간 에 SSH 비밀 로그 인 을 설정 합 니 다.
    4.클 러 스 터 설정
    4.1 다운로드 및 압축 해제
    Hadoop 을 다운로드 하 다.여기 서 제 가 다운로드 한 것 은 CDH 버 전 Hadoop 입 니 다.다운로드 주 소 는 다음 과 같 습 니 다.http://archive.cloudera.com/cdh5/cdh/5/ # tar -zvxf hadoop-2.6.0-cdh5.15.2.tar.gz4.2 환경 변수 설정
    파일 편집profile:# vim /etc/profile다음 설정 추가:export HADOOP_HOME=/usr/app/hadoop-2.6.0-cdh5.15.2export PATH=${HADOOP_HOME}/bin:$PATH source명령 을 실행 하면 설정 이 즉시 적 용 됩 니 다.
    # source /etc/profile
    4.3 설정 수정${HADOOP_HOME}/etc/hadoop디 렉 터 리 에 들 어가 프로필 을 수정 합 니 다.각 프로필 의 내용 은 다음 과 같 습 니 다.
    1. hadoop-env.sh
    #   JDK     export JAVA_HOME=/usr/java/jdk1.8.0_201/
    2. core-site.xml
    
    <configuration>
     <property>
     <!--   namenode hdfs            -->
     <name>fs.defaultFS</name>
     <value>hdfs://hadoop001:8020</value>
     </property>
     <property>
     <!--   hadoop            -->
     <name>hadoop.tmp.dir</name>
     <value>/home/hadoop/tmp</value>
     </property>
     <property>
     <!-- ZooKeeper      -->
     <name>ha.zookeeper.quorum</name>
     <value>hadoop001:2181,hadoop002:2181,hadoop002:2181</value>
     </property>
     <property>
     <!-- ZKFC   ZooKeeper     -->
     <name>ha.zookeeper.session-timeout.ms</name>
     <value>10000</value>
     </property>
    </configuration>
    3. hdfs-site.xml
    
    <configuration>
     <property>
     <!--   HDFS      -->
     <name>dfs.replication</name>
     <value>3</value>
     </property>
     <property>
     <!-- namenode    (    )     ,            ,          -->
     <name>dfs.namenode.name.dir</name>
     <value>/home/hadoop/namenode/data</value>
     </property>
     <property>
     <!-- datanode    (    )      -->
     <name>dfs.datanode.data.dir</name>
     <value>/home/hadoop/datanode/data</value>
     </property>
     <property>
     <!--           -->
     <name>dfs.nameservices</name>
     <value>mycluster</value>
     </property>
     <property>
     <!-- NameNode ID  -->
     <name>dfs.ha.namenodes.mycluster</name>
     <value>nn1,nn2</value>
     </property>
     <property>
     <!-- nn1 RPC     -->
     <name>dfs.namenode.rpc-address.mycluster.nn1</name>
     <value>hadoop001:8020</value>
     </property>
     <property>
     <!-- nn2 RPC     -->
     <name>dfs.namenode.rpc-address.mycluster.nn2</name>
     <value>hadoop002:8020</value>
     </property>
     <property>
     <!-- nn1 http     -->
     <name>dfs.namenode.http-address.mycluster.nn1</name>
     <value>hadoop001:50070</value>
     </property>
     <property>
     <!-- nn2 http     -->
     <name>dfs.namenode.http-address.mycluster.nn2</name>
     <value>hadoop002:50070</value>
     </property>
     <property>
     <!-- NameNode    JournalNode         -->
     <name>dfs.namenode.shared.edits.dir</name>
     <value>qjournal://hadoop001:8485;hadoop002:8485;hadoop003:8485/mycluster</value>
     </property>
     <property>
     <!-- Journal Edit Files      -->
     <name>dfs.journalnode.edits.dir</name>
     <value>/home/hadoop/journalnode/data</value>
     </property>
     <property>
     <!--       ,             NameNode       -->
     <name>dfs.ha.fencing.methods</name>
     <value>sshfence</value>
     </property>
     <property>
     <!--   sshfence     ssh     -->
     <name>dfs.ha.fencing.ssh.private-key-files</name>
     <value>/root/.ssh/id_rsa</value>
     </property>
     <property>
     <!-- SSH     -->
     <name>dfs.ha.fencing.ssh.connect-timeout</name>
     <value>30000</value>
     </property>
     <property>
     <!--      ,        Active   NameNode -->
     <name>dfs.client.failover.proxy.provider.mycluster</name>
     <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
     </property>
     <property>
     <!--          -->
     <name>dfs.ha.automatic-failover.enabled</name>
     <value>true</value>
     </property>
    </configuration>
    4. yarn-site.xml
    
    <configuration>
     <property>
     <!--  NodeManager        。     mapreduce_shuffle     Yarn   MapReduce  。-->
     <name>yarn.nodemanager.aux-services</name>
     <value>mapreduce_shuffle</value>
     </property>
     <property>
     <!--         (  ) -->
     <name>yarn.log-aggregation-enable</name>
     <value>true</value>
     </property>
     <property>
     <!--          (  ) -->
     <name>yarn.log-aggregation.retain-seconds</name>
     <value>86400</value>
     </property>
     <property>
     <!--   RM HA -->
     <name>yarn.resourcemanager.ha.enabled</name>
     <value>true</value>
     </property>
     <property>
     <!-- RM     -->
     <name>yarn.resourcemanager.cluster-id</name>
     <value>my-yarn-cluster</value>
     </property>
     <property>
     <!-- RM   ID   -->
     <name>yarn.resourcemanager.ha.rm-ids</name>
     <value>rm1,rm2</value>
     </property>
     <property>
     <!-- RM1      -->
     <name>yarn.resourcemanager.hostname.rm1</name>
     <value>hadoop002</value>
     </property>
     <property>
     <!-- RM2      -->
     <name>yarn.resourcemanager.hostname.rm2</name>
     <value>hadoop003</value>
     </property>
     <property>
     <!-- RM1 Web        -->
     <name>yarn.resourcemanager.webapp.address.rm1</name>
     <value>hadoop002:8088</value>
     </property>
     <property>
     <!-- RM2 Web        -->
     <name>yarn.resourcemanager.webapp.address.rm2</name>
     <value>hadoop003:8088</value>
     </property>
     <property>
     <!-- ZooKeeper      -->
     <name>yarn.resourcemanager.zk-address</name>
     <value>hadoop001:2181,hadoop002:2181,hadoop003:2181</value>
     </property>
     <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>
    </configuration>
    5. mapred-site.xml
    
    <configuration>
     <property>
     <!--  mapreduce     yarn -->
     <name>mapreduce.framework.name</name>
     <value>yarn</value>
     </property>
    </configuration>
    5. slaves
    모든 종속 노드 의 호스트 이름 이나 IP 주 소 를 줄 마다 설정 합 니 다.모든 종속 노드 의DataNode서비스 와NodeManager서비스 가 시 작 됩 니 다.
    hadoop001
    hadoop002
    hadoop003
    4.4 배포 프로그램
    Hadoop 패 키 지 를 다른 두 서버 에 배포 하고 배포 후 이 두 서버 에 도 Hadoop 의 환경 변 수 를 설정 하 는 것 을 권장 합 니 다.
    
    #        hadoop002
    scp -r /usr/app/hadoop-2.6.0-cdh5.15.2/ hadoop002:/usr/app/
    #        hadoop003
    scp -r /usr/app/hadoop-2.6.0-cdh5.15.2/ hadoop003:/usr/app/
    5.1 ZooKeeper 시작
    각각 세 대의 서버 에 가서 ZooKeeper 서 비 스 를 시작 합 니 다.
     zkServer.sh start
    5.2 저널 노드 시작
    각각 세 대의 서버${HADOOP_HOME}/sbin디 렉 터 리 에서 시작journalnode프로 세 스:
    hadoop-daemon.sh start journalnode
    5.3 NameNode 초기 화hadop001에서 초기 화 명령 을 실행 합 니 다.NameNode초기 화 명령 을 실행 한 후hdfs namenode -format메타 데이터 디 렉 터 리 의 내용 을 다른 포맷 되 지 않 은NameNode에 복사 해 야 합 니 다.메타 데이터 저장 디 렉 터 리 는 우리 가NameNode속성 으로 지정 한 디 렉 터 리 입 니 다.여기 서 우 리 는 그것 을hdfs-site.xml에 복사 해 야 한다.
     scp -r /home/hadoop/namenode/data hadoop002:/home/hadoop/namenode/
    5.4 HA 상태 초기 화
    ZooKeeper 의 HA 상 태 를 초기 화 하려 면 다음 명령 을 사용 하 십시오.
    hdfs zkfc -formatZK
    5.5 HDFS 시작dfs.namenode.name.dirhadoop002디 렉 터 리 에 들 어가 HDFS 를 시작 합 니 다.이때NameNodehadoop001${HADOOP_HOME}/sbin서비스 와 세 대의 서버hadoop001서비스 가 모두 시 작 됩 니 다.
    start-dfs.sh
    5.6 YARN 시작hadoop002NameNode디 렉 터 리 에 들 어가 YARN 을 시작 합 니 다.이때DataNodehadoop002서비스 와 세 대의 서버${HADOOP_HOME}/sbin서비스 가 모두 시 작 됩 니 다.
    start-yarn.sh
    주의해 야 할 것 은 이때hadoop002ResourceManager서 비 스 는 보통 시작 되 지 않 고 수 동 으로 시작 해 야 한 다 는 것 이다.
    yarn-daemon.sh start resourcemanager
    6.군집 보기
    6.1 프로 세 스 보기
    성공 적 으로 시작 하면 모든 서버 의 프로 세 스 는 다음 과 같 아야 합 니 다.
    
    [root@hadoop001 sbin]# jps
    4512 DFSZKFailoverController
    3714 JournalNode
    4114 NameNode
    3668 QuorumPeerMain
    5012 DataNode
    4639 NodeManager
    [root@hadoop002 sbin]# jps
    4499 ResourceManager
    4595 NodeManager
    3465 QuorumPeerMain
    3705 NameNode
    3915 DFSZKFailoverController
    5211 DataNode
    3533 JournalNode
    [root@hadoop003 sbin]# jps
    3491 JournalNode
    3942 NodeManager
    4102 ResourceManager
    4201 DataNode
    3435 QuorumPeerMain
    6.2 웹 UI 보기
    HDFS 와 YARN 의 포트 번 호 는 각각NodeManagerhadoop003이 고 화면 은 다음 과 같 아야 한다.
    이때 hadop 001 의ResourceManager는 사용 가능 한 상태 입 니 다:

    그리고 hadop 002 의50070는 예비 상태 에 있 습 니 다.

    hadop 002 의8080사용 가능 한 상태:

    hadop 003 의NameNode는 예비 상태 입 니 다.

    동시에 인터페이스 에 도NameNode관련 정보 가 있다.

    7.군집 의 2 차 시동
    위의 클 러 스 터 가 처음 시작 되 는 것 은 초기 화 작업 과 관련 되 기 때문에 과정 이 약간 번거롭다.그러나 클 러 스 터 가 구축 되면 다시 사용 하 는 것 이 편리 합 니 다.단 계 는 다음 과 같 습 니 다.(우선 ZooKeeper 클 러 스 터 가 시작 되 었 는 지 확인 하 는 것 이 좋 습 니 다)ResourceManager에서 HDFS 를 시작 합 니 다.이 때 는 NameNode,DataNode,JournalNode 를 포함 한 모든 HDFS 고가 용 서 비 스 를 시작 합 니 다.
    start-dfs.sh
    ResourceManager에서 YARN 시작 하기:
    start-yarn.sh
    이때Journal Managerhadoop001서 비 스 는 보통 시작 되 지 않 았 기 때문에 수 동 으로 시작 해 야 합 니 다.
    yarn-daemon.sh start resourcemanager
    참고 자료
    상기 구축 절 차 는 주로 공식 문 서 를 참고 합 니 다.
    HDFS High Availability Using the Quorum Journal Manager ResourceManager High Availability
    총결산
    위 에서 말 한 것 은 편집장 이 여러분 에 게 소개 한 ZooKeeper 를 바탕 으로 Hadoop 고가 용 군집 을 구축 하 는 튜 토리 얼 도해 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.편집장 은 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
    만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!

    좋은 웹페이지 즐겨찾기