一、修改配置文件

hdfs-site.xml

<configuration>
    <!--NameNode元数据存储目录-->
    <property>
      <name>dfs.namenode.name.dir</name>
      <value>"{{ data_dir }}/hadoop/hdfs/namenode"</value>
      <final>true</final>
    </property>

    <!--DataNode数据存储目录-->
    <property>
      <name>dfs.datanode.data.dir</name>
      <value>"{{ data_dir }}/hadoop/hdfs/data"</value>
      <final>true</final>
    </property>

    <!-- 指定Hadoop辅助名称节点主机配置 -->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>{{ host.host2 }}:50090</value>
    </property>

    <!-- 配置namenode的web界面-->
    <property>
        <name>dfs.namenode.http-address</name>
        <value>{{ host.host1 }}:50070</value>
    </property>

    <!-- 配置副本数 -->
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>

    <!-- ###############下面为开启HA配置############### -->
    
    <!-- HDFS逻辑名称 -->
    <property>
        <name>dfs.nameservices</name>
        <value>mycluster</value>
    </property>

    <!-- 使用逗号分隔的名称节点 ID 列表进行配置。数据节点将使用它来确定集群中的所有名称节点。 -->
    <property>
        <name>dfs.ha.namenodes.mycluster</name>
        <value>nn1,nn2</value>
    </property>

    <!-- 设置名称节点进程的完整地址和 IPC 端口 -->
    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn1</name>
        <value>{{ host.host1 }}:8020</value>
    </property>
     <property>
        <name>dfs.namenode.rpc-address.mycluster.nn2</name>
        <value>{{ host.host2 }}:8020</value>
    </property>   

    <!--  NameNode 的 HTTP 服务器设置地址 -->
    <property>
        <name>dfs.namenode.http-address.mycluster.nn1</name>
        <value>{{ host.host1 }}:9870</value>
    </property>
     <property>
        <name>dfs.namenode.http-address.mycluster.nn2</name>
        <value>{{ host.host2 }}:9870</value>
    </property>

    <!-- 配置提供共享编辑存储的 JournalNode 的地址 -->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://{{ host.host1 }}:8485;{{ host.host2 }}:8485;{{ host.host3 }}:8485/mycluster</value>
    </property>
  
    <!-- 配置 DFS 客户端将使用的 Java 类的名称,以确定哪个 NameNode 是当前活动节点 -->
    <property>
        <name>dfs.client.failover.proxy.provider.mycluster</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>

    <!-- 配置 DFS 客户端将使用的 Java 类的名称,以确定哪个 NameNode 是当前活动节点 -->
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>
            sshfence
            shell(/bin/true)
        </value>
    </property>
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/root/.ssh/id_rsa</value>
    </property>

    <!-- 存储 JN 使用的编辑和其他本地状态 -->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>{{data_dir }}/hadoop/hdfs/journalnode/</value>
    </property>

    <!-- 阻止安全模式名称节点变为活动状态 -->
    <property>
        <name>dfs.ha.nn.not-become-active-in-safemode</name>
        <value>true</value>
    </property>

    <!-- 配置自动故障转移 -->
    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>
</configuration>

core-site.xml

<configuration>
    <!-- 配置HDFS运行时临时数据路径到持久化目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>"{{ data_dir }}/hadoop/tmp"</value>
        <description>Abase for other temporary directories.</description>
    </property>

    <!--默认的文件系统名称,HDFS访问地址-->
    <!-- <property>
        <name>fs.defaultFS</name>
        <value>hdfs://{{ host.host1 }}:9000</value>
    </property> -->

   <!-- 下面两项为开启HA需要的配置 -->
   <!-- 开启HA后的NN访问地址 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://{{ NamenodeserviceId }}</value>
    </property>

    <!-- Zookeeper集群地址 -->
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>{{ host.host1 }}:2181,{{ host.host2 }}:2181,{{ host.host3 }}:2181</value>
    </property> 

  
    <!--配置所有节点的root用户都可作为代理用户-->
    <property>
        <name>hadoop.proxyuser.root.hosts</name>
        <value>*</value>
    </property>
    
    <!--配置root用户能够代理的用户组为任意组-->
    <property>
        <name>hadoop.proxyuser.root.groups</name>
        <value>*</value>
    </property>
    
    <!--配置root用户能够代理的用户为任意用户-->
    <property>
        <name>hadoop.proxyuser.root.users</name>
        <value>*</value>
    </property>

    <property>
      <name>hadoop.proxyuser.hdfs.groups</name>
      <value>*</value>
    </property>
    
    <property>
      <name>hadoop.proxyuser.hdfs.hosts</name>
      <value>*</value>
    </property>

    <property>
      <name>hadoop.proxyuser.hive.groups</name>
      <value>*</value>
    </property>
    
    <property>
      <name>hadoop.proxyuser.hive.hosts</name>
      <value>*</value>
    </property>
</configuration>

二、格式化

1、启动所有 JournalNode 集群,所有JN节点执行,用于同步两个 HA 名称节点的磁盘元数据

hdfs --daemon start journalnode

2、主节点格式化并启动 NameNode

hdfs namenode -format
hdfs --daemon start namenode

格式化执行结果:

Apache Hadoop开启HA_hdfs

3、备节点格式化并启动 NameNode

hdfs namenode -bootstrapStandby #将 NameNode 元数据目录的内容复制到另一个未格式化的 NameNode
hdfs --daemon start namenode

Apache Hadoop开启HA_hadoop_02

4、现在访问两个HFDFS的web页面内,查看都是standby状态

Apache Hadoop开启HA_hdfs_03

Apache Hadoop开启HA_hdfs_04

5、手动指定active节点

hdfs haadmin -transitionToActive nn1

查看状态已变更

[root@ky10sp2-wnc-test01 sbin]# hdfs haadmin -getServiceState nn1
active
[root@ky10sp2-wnc-test01 sbin]# hdfs haadmin -getServiceState nn2
standby


6、在maser1上格式化zookeeper,将在 ZooKeeper 中创建一个 znode,自动故障转移系统在其中存储其数据

hdfs zkfc -formatZK

执行结果:

Apache Hadoop开启HA_root用户_05

7、在master1上初始化共享编辑日志

需要先停止NameNode,且

hdfs namenode -initializeSharedEdits
# 该命令将使用本地 NameNode 编辑目录中的编辑数据初始化 JournalNodes

执行过程需要确认

Apache Hadoop开启HA_hadoop_06

执行结果

Apache Hadoop开启HA_hdfs_07


问题处理

问题1:JN存储目录不为空

Apache Hadoop开启HA_root用户_08

进入JN数据目录,删除所有文件,再次进行格式化

[root@ky10sp2-wnc-test03 ~]# cd /data/hadoop/hdfs/journalnode/mycluster
[root@ky10sp2-wnc-test03 mycluster]# rm -rf ./*