• 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
    

      

     
     
     
     
     
     
  • 相关阅读:
    0309. Best Time to Buy and Sell Stock with Cooldown (M)
    0621. Task Scheduler (M)
    0106. Construct Binary Tree from Inorder and Postorder Traversal (M)
    0258. Add Digits (E)
    0154. Find Minimum in Rotated Sorted Array II (H)
    0797. All Paths From Source to Target (M)
    0260. Single Number III (M)
    0072. Edit Distance (H)
    0103. Binary Tree Zigzag Level Order Traversal (M)
    0312. Burst Balloons (H)
  • 原文地址:https://www.cnblogs.com/zzc-log/p/9591917.html
Copyright © 2020-2023  润新知