HDFS-HA 手动模式

环境准备

(1)修改 IP
(2)修改主机名及主机名和 IP 地址的映射
(3)关闭防火墙
(4)ssh 免密登录
(5)安装 JDK,配置环境变量等

规划集群

hadoop102 hadoop103 hadoop104
NameNode NameNode NameNode
JournalNode JournalNode JournalNode
DataNode DataNode DataNode

JournalNode作用:NameNode之间相互通信!

配置 HDFS-HA 集群

1)官方地址:http://hadoop.apache.org/
2)在 opt 目录下创建一个 ha 文件夹

[root@hadoop102 ~]$ cd /opt
[root@hadoop102 opt]$ mkdir ha

3)将/opt/module/下的 hadoop-3.1.3 拷贝到/opt/ha 目录下(记得删除 data 和 log 目录)

[root@hadoop102 opt]$ cp -r /opt/module/hadoop-3.1.3 /opt/ha/

4)配置 core-site.xml

<?xml version="1.0" encoding="utf-8"?>

<configuration> 
  <!-- 把多个 NameNode 的地址组装成一个集群 mycluster -->  
  <property> 
    <name>fs.defaultFS</name>  
    <value>hdfs://mycluster</value> 
  </property>  
  <!-- 指定 hadoop 运行时产生文件的存储目录 -->  
  <property> 
    <name>hadoop.tmp.dir</name>  
    <value>/opt/ha/hadoop-3.1.3/data</value> 
  </property> 
</configuration>

5)配置 hdfs-site.xml

<?xml version="1.0" encoding="utf-8"?>

<configuration> 
  <!-- NameNode 数据存储目录 -->  
  <property> 
    <name>dfs.namenode.name.dir</name>  
    <value>file://${hadoop.tmp.dir}/name</value> 
  </property>  
  <!-- DataNode 数据存储目录 -->  
  <property> 
    <name>dfs.datanode.data.dir</name>  
    <value>file://${hadoop.tmp.dir}/data</value> 
  </property>  
  <!-- JournalNode 数据存储目录 -->  
  <property> 
    <name>dfs.journalnode.edits.dir</name>  
    <value>${hadoop.tmp.dir}/jn</value> 
  </property>  
  <!-- 完全分布式集群名称 -->  
  <property> 
    <name>dfs.nameservices</name>  
    <value>mycluster</value> 
  </property>  
  <!-- 集群中 NameNode 节点都有哪些 -->  
  <property> 
    <name>dfs.ha.namenodes.mycluster</name>  
    <value>nn1,nn2,nn3</value> 
  </property>  
  <!-- NameNode 的 RPC 通信地址 -->  
  <property> 
    <name>dfs.namenode.rpc-address.mycluster.nn1</name>  
    <value>hadoop102:8020</value> 
  </property>  
  <property> 
    <name>dfs.namenode.rpc-address.mycluster.nn2</name>  
    <value>hadoop103:8020</value> 
  </property>  
  <property> 
    <name>dfs.namenode.rpc-address.mycluster.nn3</name>  
    <value>hadoop104:8020</value> 
  </property>  
  <!-- NameNode 的 http 通信地址 -->  
  <property> 
    <name>dfs.namenode.http-address.mycluster.nn1</name>  
    <value>hadoop102:9870</value> 
  </property>  
  <property> 
    <name>dfs.namenode.http-address.mycluster.nn2</name>  
    <value>hadoop103:9870</value> 
  </property>  
  <property> 
    <name>dfs.namenode.http-address.mycluster.nn3</name>  
    <value>hadoop104:9870</value> 
  </property>  
  <!-- 指定 NameNode 元数据在 JournalNode 上的存放位置 -->  
  <property> 
    <name>dfs.namenode.shared.edits.dir</name>  
    <value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/mycluster</value> 
  </property>  
  <!-- 访问代理类:client 用于确定哪个 NameNode 为 Active -->  
  <property> 
    <name>dfs.client.failover.proxy.provider.mycluster</name>  
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> 
  </property>  
  <!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->  
  <property> 
    <name>dfs.ha.fencing.methods</name>  
    <value>sshfence</value> 
  </property>  
  <!-- 使用隔离机制时需要 ssh 秘钥登录-->  
  <property> 
    <name>dfs.ha.fencing.ssh.private-key-files</name>  
    <value>/root/.ssh/id_rsa</value> 
  </property> 
</configuration>

6)分发配置好的 hadoop 环境到其他节点

启动 HDFS-HA 集群

1)将 HADOOP_HOME 环境变量更改到 HA 目录(三台机器)

[root@hadoop102 ~]$ sudo vim /etc/profile.d/my_env.sh

将 HADOOP_HOME 部分改为如下

#HADOOP_HOME
export HADOOP_HOME=/opt/ha/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

去三台机器上 source 环境变量

[root@hadoop102 ~]$ source /etc/profile

2)在各个 JournalNode 节点上,输入以下命令启动 journalnode 服务

[root@hadoop102 ~]$ hdfs --daemon start journalnode
[root@hadoop103 ~]$ hdfs --daemon start journalnode
[root@hadoop104 ~]$ hdfs --daemon start journalnode

3)在[nn1] (hadoop102)上,对其进行格式化,并启动

[root@hadoop102 ~]$ hdfs namenode -format
[root@hadoop102 ~]$ hdfs --daemon start namenode

4)在[nn2]和[nn3] (hadoop103和hadoop104)上,同步 nn1 的元数据信息

[root@hadoop103 ~]$ hdfs namenode -bootstrapStandby
[root@hadoop104 ~]$ hdfs namenode -bootstrapStandby

5)启动[nn2]和[nn3]

[root@hadoop103 ~]$ hdfs --daemon start namenode
[root@hadoop104 ~]$ hdfs --daemon start namenode

在这里插入图片描述

6)查看 web 页面显示

102图

在这里插入图片描述

103图

在这里插入图片描述
104图

在这里插入图片描述
7)在所有节点上,启动 datanode

[root@hadoop102 ~]$ hdfs --daemon start datanode
[root@hadoop103 ~]$ hdfs --daemon start datanode
[root@hadoop104 ~]$ hdfs --daemon start datanode

在这里插入图片描述

8)将[nn1]切换为 Active

[root@hadoop102 ~]$ hdfs haadmin -transitionToActive nn1

9)查看是否 Active

[root@hadoop102 ~]$ hdfs haadmin -getServiceState nn1

客户端图

在这里插入图片描述
网页图

在这里插入图片描述

问题提出

当hadoop102的 namenode挂掉了怎么办?

测试:
在这里插入图片描述

hadoop102 网页 :

在这里插入图片描述
此时hadoop 103 和 104 依然都是从节点

在这里插入图片描述
在这里插入图片描述
所以也就是说,当hadoop102 (主节点)挂掉了之后,103和104两个从节点并不会变成主节点,现在手动将hadoop103变成主节点尝试 (没有启动hadoop102的情况下)

在这里插入图片描述

结果显示,报错。现在我们将hadoop102中的NN启动,再次开始将hadoop103变成主节点尝试

[root@hadoop102 ~]$ hdfs --daemon start namenode
[root@hadoop103 ~]$ hdfs haadmin -transitionToActive nn2

结果成功

在这里插入图片描述
hadoop102 和 hadoop103 的网页图

在这里插入图片描述
在这里插入图片描述
所以结果就是,当一个节点挂掉之后,就算是手动模式启动其他节点,也要等挂掉的节点起来之后,才能去手动将其他节点的机器变成主节点。

Guess you like

Origin blog.csdn.net/weixin_45417821/article/details/121269361