• Hadoop HA(高可用搭建)


    上次记录了hadoop完全分布式搭建(非高可用),这次来学习hadoop HA 搭建。

    一、原理机制

    主备NameNode
    解决单点故障(属性,位置)

    • 主NameNode对外提供服务,备NameNode同步主NameNode元数据,以待切换
    • 所有DataNode同时向两个NameNode汇报数据块信息(位置)
    • JNN:集群(属性)
    • standby:备,完成了edits.log文件的合并产生新的image,推送回ANN

    两种切换选择

    • 手动切换:通过命令实现主备之间的切换,可以用HDFS升级等场合
    • 自动切换:基于Zookeeper实现

    基于Zookeeper自动切换方案

    • ZooKeeper Failover Controller:监控NameNode健康状态,
    • 并向Zookeeper注册NameNode
    • NameNode挂掉后,ZKFC为NameNode竞争锁,获得ZKFC 锁的NameNode变为active

    二、步骤

    集群规划

    NN-1 NN-2 DN ZK ZKFC JNN
    node01 * * *
    node02 * * * * *
    node03 * * *
    node04 * *

    1.修改hadoop.ev.sh文件

    (hadoop3.x中要求指定用户进程)

    export HDFS_ZKFC_USER=root
    export HDFS_JOURNALNODE_USER=root
    

    2.配置hdfs-site.xml

    (这里配置有点多,查看官方文档介绍:hadoop-3.2.0 doc HDFSHighAvailabilityWithQJM

    dfs.nameservices - the logical name for this new nameservice

    (名称服务,只是一个逻辑名称逻辑名称)

    <!--为这个nameservice选择一个逻辑名称,例如“mycluster”,并为这个配置选项的值使用这个逻辑名称。您选择的名称是任意的。它将用于配置并作为集群中绝对HDFS路径的权威组件。-->
    <property>
      <name>dfs.nameservices</name>
      <value>mycluster</value>
    </property>
    

    dfs.ha.namenodes.[nameservice ID] - unique identifiers for each NameNode in the nameservice

    (名称服务中每个NameNode的惟一标识符)

    <!--使用逗号分隔的NameNode id列表进行配置。datanode将使用它来确定集群中的所有namenode。例如,本文使用“mycluster”作为nameservice ID,并且我们集群规划使用“node01”、“node02”作为namenode的单独ID,可以这样配置:-->
    <property>
      <name>dfs.ha.namenodes.mycluster</name>
      <value>node01,node02</value>
    </property>
    <!--官网建议:HA的最小namenode数量是两个,但是您可以配置更多。由于通信开销,建议不超过5个(建议使用3个namenode)-->
    

    dfs.namenode.rpc-address.[nameservice ID].[name node ID] - the fully-qualified RPC address for each NameNode to listen on

    (namenode的rpc服务器的监听地址)

    <property>
      <name>dfs.namenode.rpc-address.mycluster.node01</name>
      <value>node01:8020</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-address.mycluster.node02</name>
      <value>node02:8020</value>
    </property>
    

    dfs.namenode.http-address.[nameservice ID].[name node ID] - the fully-qualified HTTP address for each NameNode to listen on

    (namenode的HTTP服务器的监听地址,与rpc同理只不过端口变为9870)

    <property>
      <name>dfs.namenode.http-address.mycluster.node01</name>
      <value>node01:9870</value>
    </property>
    <property>
      <name>dfs.namenode.http-address.mycluster.node02</name>
      <value>node02:9870</value>
    </property>
    

    dfs.namenode.shared.edits.dir - the URI which identifies the group of JNs where the NameNodes will write/read edits

    (配置JournalNodes 集群的URI)

    <!--这是配置提供共享编辑存储的journalnode地址的地方,这些地址由活动nameNode写入,由备用nameNode读取,以便与活动nameNode所做的所有文件系统更改保持最新。虽然必须指定几个JournalNode地址,但是应该只配置其中一个uri。URI的形式应该是:qjournal://*host1:port1*;*host2:port2*;*host3:port3*/*journalId*。日志ID是这个名称服务的惟一标识符,它允许一组日志节点为多个联合名称系统提供存储-->
    <property>
      <name>dfs.namenode.shared.edits.dir</name>
      <value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
    </property>
    

    dfs.client.failover.proxy.provider.[nameservice ID] - the Java class that HDFS clients use to contact the Active NameNode

    (配置故障转移代理类)

    <property>
      <name>dfs.client.failover.proxy.provider.mycluster</name>
      <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    

    dfs.ha.fencing.methods - a list of scripts or Java classes which will be used to fence the Active NameNode during a failover

    (隔离方法;确保当前时间点只有一个namenode处于active状态,jurnalnode只允许1个namenode来读写数据,但是也会出现意外的情况,因此需要控制对方机器,进行将自我提升[active],将对方降级[standby])

    <property>
         <name>dfs.ha.fencing.methods</name>
         <value>sshfence</value>
    </property>
    
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/root/.ssh/id_rsa</value>
    </property>
    

    dfs.journalnode.edits.dir - the path where the JournalNode daemon will store its local state

    (journalnode日志存放路径)

    <property>
      <name>dfs.journalnode.edits.dir</name>
      <value>/opt/tmp/hadoop/journalnode/data</value>
    </property>
    

    3.core-site.xml

    (注意更改下 hadoop.tmp.dir 的路径,与node的名称【类似一个域名多ip】)

    <configuration>
            <property>
                    <name>fs.defaultFS</name>
                    <value>hdfs://mycluster</value>
            </property>
            <property>
                    <name>hadoop.tmp.dir</name>
                    <value>/opt/tmp/hadoop/ha</value>
            </property>
    </configuration>
    

    4.自动故障转移配置【zk】

    再次回到hdfs-site.xml文件与core-site.xml配置中:

    打开自动故障转移:

    The configuration of automatic failover requires the addition of two new parameters to your configuration. In your hdfs-site.xml file, add:

    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>
    

    添加zookeeper的地址:

    This specifies that the cluster should be set up for automatic failover. In your core-site.xml file, add:

    <property>
        <name>ha.zookeeper.quorum</name>
        <value>node02:2181,node03:2181,node04:2181</value>
    </property>
    

    5.分发配置到其他节点

    注意workes也要配置

    scp -r hadoop-env.sh core-site.xml hdfs-site.xml node04:`pwd`
    

    6.安装Zookeeper及配置

    安装:略

    配置zoo.cfg:

    dataDir=/opt/tmp/zookeeper
    
    server.1=192.168.121.102:2888:3888
    server.2=192.168.121.103:2888:3888
    server.3=192.168.121.104:2888:3888
    

    创建myid【1 2 3同理】:

    mkdir /opt/tmp/zookeeper
    echo 1 > /opt/tmp/zookeeper/myid
    

    7.启动Hadoop HA

    1. 启动zookeeper集群

      zkServer.sh start
      
    2. 启动jurnalnode集群

      hadoop-daemon.sh start journalnode
      或者 hdfs --daemon start journalnode
      
    3. 启动第一台namenode

      hdfs namenode -format
      hadoop-deamon.sh start namenode
      或者 hdfs --daemon start namenode
      
    4. 剩余namenode启动做备

      hdfs namenode  -bootstrapStandby
      
    5. 启动datanode等节点

      start-dfs.sh
      
    6. Initializing HA state in ZooKeeper(在ZooKeeper中初始化HA状态)

      hdfs zkfc -formatZK
      

    三、测试

    访问node01:9870: Overview 'node02:8020' (active)

    访问node02:9870: Overview 'node02:8020' (standby)

    1.namenode挂掉的情况

    hadoop-daemon.sh stop namenode 或者
    hdfs --daemon stop namenode
    

    2.ZKFC挂掉的情况

    hadoop-daemon.sh stop zkfc 或者
    hdfs --daemon stop zkfc
    
  • 相关阅读:
    情人节玫瑰花
    Yii2美化confirm
    apache ab压力测试
    Yii2的Debug工具
    yii2的扩展程序包
    slim
    composer使用
    打印
    yii的csv导出
    ajax文件下载
  • 原文地址:https://www.cnblogs.com/nm666/p/11111319.html
Copyright © 2020-2023  润新知