zoukankan      html  css  js  c++  java
  • Hadoop 高可用

    NameNode 高可用


    •为什么 NameNode 需要高可用
    – NameNode 是 HDFS 的核心配置,HDFS 又是  Hadoop 的核心组件,NameNode 
       在 Hadoop 集群中至关重要,NameNode机器宕机,将导致集群不可用,如果NameNode 
       数据丢失将导致整个集群的数据丢失,而 NameNode 的数据的更新又比较频繁,实现 
       NameNode 高可用势在必行
     
    • 为什么 NameNode 需要高可用
    – 官方提供了两种解决方案
    – HDFS with NFS
    – HDFS with QJM
    – 两种翻案异同
    ===============================
    NFS                              QJM
    ===============================
    NN                               NN
    ZK                                ZK
    ZKFailoverController    ZKFailoverController
    NFS                              JournalNode
    ===============================
    • HA 方案对比
    1. 都能实现热备
    2. 都是一个active NN 和一个 standby NN
    3. 都使用Zookeeper 和 ZKFC 来实现自劢失效恢复
    4. 失效切换都使用 fencing 配置的方法来 active NN
    5. NFS 数据数据共享变更方案把数据存储在共享存储里面,我们还需要考虑 NFS 的高可用设计
    6. QJM 不需要共享存储,但需要让每一个 DN 都知道两个 NN 的位置,并把块信息和心跳包 发送给active和 standby这两个 NN
    • NameNode 高可用方案 (QJM)
    – 为了解决 NameNode 单点故障问题,Hadoop 给出了 HDFS 的高可用HA方案:HDFS 通常由
       两个NameNode组成,一个处于 active 状态,另一个处于standby 状态。Active 
       NameNode对外提供服务,比如处理来自客户端的 RPC 请求,而 StandbyNameNode 则不
       对外提供服务,仅同步 ActiveNameNode 的状态,以便能够在它失败时迚行切换。
     
    • NameNode 高可用架构
    1、 一个典型的HA集群,NameNode会被配置在两台独立的机器上,在任何时间上,一个NameNode  
          处于活劢状态,而另一个NameNode处于备份状态,活劢状态的NameNode会响应集群中所有的
         客户端,备份状态的NameNode只是作为一个副本,保证在必要的时候提供一个快速的转移。
     
    2、为了让Standby Node与Active Node保持同步,这两个Node都与一组称为JNS的互相独立的进
         程保持通信(Journal Nodes)。当Active Node上更新了namespace,它将记录修改日志发送给
         JNS的多数派。Standby noes将会从JNS中读取这些edits,并持续关注它们对日志的变更。      
         Standby Node将日志变更应用在自己的namespace中,当failover发生时,Standby将会在提升
         自己为Active之前,确保能够从JNS中读取所有的edits,即在failover发生之前Standy持有的      
         namespace 应该不Active保持完全同步。
     
    3、NameNode 更新是很频繁的,为了的保持主备数据的一致性,为了支持快速failover, Standby
         node持有集群中blocks的最新位置是非常必要的。为了达到这一目的,DataNodes上需要同时
         配置这两个Namenode的地址,同时和它们都建立心跳链接,并把block位置发送给它们
     
    4、还有一点非常重要,任何时刻,只能有一个ActiveNameNode,否则将会导致集群操作的混乱,
         那么两个NameNode将会分别有两种不同的数据状态,可能会导致数据丢失,或者状态异常,
         这种情况通常称为“split-brain”(脑裂,三节点通讯阻断,即集群中不同的Datanode 看到了
         不同的Active NameNodes)。对于JNS而言,任何时候只允讲一个NameNode作为writer;在ailover期间,
         原来的Standby Node将会接管Active的所有职能,并负责向JNS写入日志记录,
         这种机制阻止了其他NameNode基于处于Active状态的问题。
     
    Hadoop 高可用搭建配置
     
    搭建hadoop高可用 是基于 zookeeper 环境下的
    zookeeper 是在启动的环境下的
     
    首先集群都要配置 /etc/hosts  文件
    10.211.55.10    nn01 
    10.211.55.20    nn02
    10.211.55.11    node1
    10.211.55.12    node2
    10.211.55.13    node3
     
     
    如果要从新做
    所有节点 : 初始化 hdfs 集群,删除 /var/hadoop/*
     
     
    NN2: 关闭 ssh key 验证,部署公钥私钥
    StrictHostKeyChecking no
    scp nn01:/root/.ssh/id_rsa /root/.ssh/
    scp nn01:/root/.ssh/authorized_keys /root/.ssh/
     
    在一台Namenode上配置   主 Namenode 配置文件
     在NN01上配置
    vim  /usr/local/hadoop/etc/hadoop/core-site.xml
    <configuration>
        <property>
    <!-- 指定hdfs的nameservice为nsdcluster --> <name>fs.defaultFS</name> <value>hdfs://nsdcluster</value> </property>
    <property>
     <!--指定hadoop数据临时存放目录--> <name>hadoop.tmp.dir</name> <value>/var/hadoop</value> </property>
    <property>
    <!--指定zookeeper地址--> <name>ha.zookeeper.quorum</name> <value>node1:2181,node2:2181,node3:2181</value> </property> <property> <name>hadoop.proxyuser.nsd1804.groups</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.nsd1804.hosts</name> <value>*</value> </property> </configuration>

      

       配置 hdfs-site.xml                                                                                                                                                                       
    vim  /usr/local/hadoop/etc/hadoop/hdfs-site.xml
    
    <configuration>
        <property>
            <name>dfs.replication</name>
            <value>2</value>
        </property>
        <property>
    <!--指定hdfs的nameservice为nsdcluster,需要和core-site.xml中的保持一致 -->
            <name>dfs.nameservices</name>          
            <value>nsdcluster</value>
        </property>
        <property>
    <!-- nsdcluster下面有两个NameNode,分别是nn1,nn2 -->
            <name>dfs.ha.namenodes.nsdcluster</name>
            <value>nn1,nn2</value>
        </property>
        <property>
    <!-- nn1的RPC通信地址 -->
            <name>dfs.namenode.rpc-address.nsdcluster.nn1</name>
            <value>nn01:8020</value>
        </property>
        <property>
    <!-- nn2的RPC通信地址 -->
            <name>dfs.namenode.rpc-address.nsdcluster.nn2</name>
            <value>nn02:8020</value>
        </property>
        <property>
    <!-- nn1的http通信地址 -->
            <name>dfs.namenode.http-address.nsdcluster.nn1</name>
            <value>nn01:50070</value>
        </property>
        <property>
    <!-- nn1的http通信地址 -->
            <name>dfs.namenode.http-address.nsdcluster.nn2</name>
            <value>nn02:50070</value>
        </property>
        <property>
    <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
            <name>dfs.namenode.shared.edits.dir</name>
            <value>qjournal://node1:8485;node2:8485;node3:8485/nsdcluster</value>
        </property>
        <property>
    <!-- 指定JournalNode在本地磁盘存放数据的位置 -->
            <name>dfs.journalnode.edits.dir</name>
            <value>/var/hadoop/journal</value>
        </property>
        <property>
    <!-- 配置失败自动切换实现方式 -->
            <name>dfs.client.failover.proxy.provider.nsdcluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <property> <!-- 配置隔离机制,如果ssh是默认22端口,value直接写sshfence即可 --> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <property> <!-- 使用隔离机制时需要ssh免登陆 --> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> <property> <!-- 开启NameNode故障时自动切换 --> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <property> <!-- 在NN和DN上开启WebHDFS (REST API)功能,不是必须 --> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> </configuration>

      

      

     
    配置 mapred-site.xml
     vim   /hadoop/etc/hadoop/mapred-site.xml
    
    <configuration>  
      <property>  
        <name>mapreduce.framework.name</name>  
        <value>yarn</value>  
      </property>   
    </configuration>
    

      

    配置文件  yarn-site.xml 
    vim  /usr/local/hadoop/etc/hadoop/yarn-site.xml 
    
    <configuration>
    <!-- 指定nodemanager启动时加载server的方式为shuffle server -->
        <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
        </property>
    <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</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> <property> <name>yarn.resourcemanager.zk-address</name> <value>node1:2181,node2:2181,node3:2181</value> </property> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yarn-ha</value> </property>
    <!-- 指定resourcemanager地址 --> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>nn01</value> </property>
     <!-- 指定resourcemanager地址 --> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>nn02</value> </property> </configuration>

      

    #-----------------------------------------------------#

    初始化启动集群
    ALL: 所有机器
    nodeX: node1 node2 node3
    NN1: nn01
    NN2: nn02
    #-----------------------------------------------------#


    ALL: 同步配置文件到所有集群机器

     把上面所有修改的文件同步到其他集群服务器上
     

    NN1: 初始化ZK集群 ./bin/hdfs zkfc -formatZK

    nodeX: 启动 journalnode 服务 

    cd  /usr/local/hadoop/
    ./sbin/hadoop-daemon.sh start journalnode
    
    出现下面的就成功了
    Successfully created /hadoop-ha/nsdcluster in ZK 

    NN1: 格式化 

    ./bin/hdfs namenode -format

    NN2: 数据同步到本地 /var/hadoop/dfs

    把NN1上 /var/hadoop/dfs  同步到 NN2上

     
     
    NN1: 初始化 JNS
    ./bin/hdfs namenode -initializeSharedEdits
    

      

     
    nodeX: 停止 journalnode 服务
            
    ./sbin/hadoop-daemon.sh stop journalnode 
     
    #-----------------------------------------------------#
    启动集群
    NN1: 
    ./sbin/start-all.sh
     
    NN2: 
    ./sbin/yarn-daemon.sh start resourcemanager
     
    查看集群状态
    ./bin/hdfs haadmin -getServiceState nn1  
    ./bin/hdfs haadmin -getServiceState nn2
    ./bin/yarn rmadmin -getServiceState rm1
    ./bin/yarn rmadmin -getServiceState rm2
    

      

    查看状态 
    ./bin/hdfs dfsadmin -report
    ./bin/yarn  node  -list
    

      

     
    访问集群:
    ./bin/hadoop  fs -ls  /
    ./bin/hadoop  fs -mkdir hdfs://nsdcluster/input
    

      

     
    验证高可用,关闭 active namenode
    ./sbin/hadoop-daemon.sh  stop  namenode
    ./sbin/yarn-daemon.sh  stop  resourcemanager
    

      

    恢复节点
    ./sbin/hadoop-daemon.sh  start  namenode
    ./sbin/yarn-daemon.sh  start  resourcemanager
    

      

     
     
     
     
     
     
  • 相关阅读:
    SpringCloud学习笔记【七】:Eureka,Consul,Zookeeper注册中心异同点
    SpringCloud学习笔记【六】:Consul实现服务注册与发现
    Docker安装Consul
    SpringCloud学习笔记【五】:Zookeeper代替Eureka实现服务注册与发现
    Docker安装Zookeeper以及Zk常用命令
    SpringCloud学习笔记【四】:Eureka的自我保护机制
    教你如何使用docsify快速部署优美的在线文档
    SpringCloud学习笔记【三】:Actuator微服务信息完善+Discovery获取注册信息
    SpringCloud学习笔记【二】:Eureka服务注册与发现
    WPF应用中一种比较完美的权限控制设计方式
  • 原文地址:https://www.cnblogs.com/zzc-log/p/9591917.html
Copyright © 2011-2022 走看看