文章目录

  • ​​1 预先说明​​
  • ​​1.1 软件版本说明​​
  • ​​1.2 集群配置说明​​
  • ​​2 集群规划​​
  • ​​3 搭建环境​​
  • ​​3.1 修改配置文件​​
  • ​​3.2 zookeeper 的安装与配置​​
  • ​​3.3 启动测试​​

1 预先说明

1.1 软件版本说明

  • 操作系统:CentOS-7-x86_64-DVD-1804.iso
  • JDK:jdk-8u202-linux-x64.tar.gz
  • Hadoop:hadoop-3.1.3.tar.gz
  • zookeeper:apache-zookeeper-3.7.0-bin.tar.gz

1.2 集群配置说明

之前已经配置过 Hadoop 完全分布式运行模式(文章:​​【Hadoop 3】图文详解:搭建Hadoop完全分布式运行模式​​)本文将在其基础上进行修改,从而搭建 HDFS 的高可用环境。

2 集群规划

hadoop102

hadoop103

hadoop104

NameNode

DataNode

JournalNode

Jps

DFSZKFailoverController

QuorumPeerMain

DataNode

JournalNode

Jps

QuorumPeerMain

NameNode

DataNode

JournalNode

Jps

DFSZKFailoverController

QuorumPeerMain

3 搭建环境

3.1 修改配置文件

1、修改 core-site.xml,配置 Hadoop 客户端的默认路径以使用新的启用 HA 的逻辑 URI,如果之前使用“qf”作为名称服务 ID,这将是所有 HDFS 路径的授权部分的值。

(参考官方)

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hadoop

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hdfs_02

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hadoop_03


2、修改 hdfs-site.xml

(1)为此名称服务选择一个逻辑名称(与上面的 core-site.xml 中 fd.defaultFS 属性对应的 value 值对应),它将用于配置和集群中绝对 HDFS 路径的权限组件。

(参考官方)

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hdfs_04


【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_big data_05

(2)使用逗号分隔的 NameNode ID 列表进行配置。DataNode 将使用它来确定集群中的所有 NameNode,并使用“nn1”和“nn2”作为 NameNode 的单个 ID。

(参考官方)

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_big data_06


【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_big data_07


(3)配置每个 NameNode 监听的完全限定的 RPC 地址,用于 NameNode 的内部通信地址,对于之前配置的两个 NameNode ID,设置 NameNode 进程的完整地址和 IPC 端口。(参考官方)

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hdfs_08


【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hadoop_09

(4)配置每个 NameNode 监听的完全限定的 HTTP 地址,用于 NameNode 的 web ui 的通信地址,与上面的 rpc-address 类似,设置两个 NameNode 的 HTTP 服务器的地址以进行侦听。

(参考官方)

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hdfs_10

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_big data_11

(5)配置提供共享编辑存储的 JournalNode 的地址。

(参考官方)

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hdfs_12


【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hdfs_13

(6)指定 NameNode 失败后进行自动切换的主类。

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hdfs_14


【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_big data_15


(7)出现 “脑裂” 后,采取某种方式杀死其中一个 NameNode;同时也要配置 shh 免密,不然会要求输入密码,将可能导致杀死失败而且还有人工手动操作的麻烦;还可配置杀死超时时间,若超过此时间仍未杀死另一个处于 Active 的 NameNode,那么则报超时。(参考官方)

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hdfs_16


【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hdfs_17

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hadoop_18


(8)JournalNode 守护进程将存储其本地状态的路径,即 JournalNode 的本地共享目录。(参考官方)

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_zookeeper_19


【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_big data_20


(9)配置自动故障转移。(参考官方)

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_zookeeper_21


【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_big data_22


注意,下图是在 core-site.xml 中添加:

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_big data_23


(10)将此配置分发给集群中的其他机器(此 xsync 脚本是封装的 shell 命令,具体可参考之前搭建 hadoop 完全分布式环境的文章)。

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hadoop_24

3.2 zookeeper 的安装与配置

1、下载并解压 zookeeper

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hadoop_25


2、配置环境变量

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hdfs_26

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hdfs_27

3、自定义 zoo.cfg 配置

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hdfs_28


【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hdfs_29

(参考官方)

关于此配置,zookeeper 的官网也有详细介绍:​​链接地址​

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_zookeeper_30


4、分发 zookeeper 给其他客户机(1)分发 PATH 配置

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hdfs_31

(2)分发 Zookeeper

在 hadoop102 上:

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_zookeeper_32


在 hadoop103 上:

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hadoop_33

在 hadoop104 上:

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hdfs_34


(3)创建在 zoo.cfg 中 dataDir 属性指定的目录也要在上面 dataDir 属性指定的值中创建相应的目录,用来存储 zookeeper 的数据

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_big data_35


也要讲 zkdata 目录分发给其他客户机

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hdfs_36


(4)创建并配置 myid 文件在 hadoop102 上:

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hdfs_37

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hadoop_38


在 hadoop103 上:

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_big data_39

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_big data_40

在 hadoop104 上:

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_zookeeper_41

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hdfs_42

3.3 启动测试

1、在各节点上启动 zookeeper(只要有半数以上的机器启动 zookeeper 就可以发挥作用),启动后,各节点都应该有 QuorumPeerMain 进程

(1)启动 zookeeper

zkServer.sh start

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_zookeeper_43

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hdfs_44

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hadoop_45

(2)查看 zookeeper 运行情况

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_big data_46


【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hadoop_47


【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_big data_48


2、启动 journalnode 服务,此时,各节点的 JournalNode 进程都应该已经启动成功

sbin/hadoop-daemons.sh start journalnode

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hadoop_49


【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hdfs_50


【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hdfs_51


【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_big data_52

3、挑选两个 NameNode 之中的一台来格式化,然后启动

(格式化方式可参考之前文章,但是,请注意,此处 HDFS 高可用环境下的 namenode 格式化要先启动 zookeeper 和 journalnode:​​【Hadoop 3】集群管理:集群中结点的添加、删除(图文总结)​​)

hdfs namenode -format

4、将数据目录复制到另一台 NameNode 的机器(hadoop104)上

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hadoop_53

采取复制方式

scp -r data/ hadoop104:/opt/module/hadoop-3.1.3/

在 hadoop102 上执行复制操作,复制给另一台配置 NameNode 进程的主机 hadoop104

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_big data_54


【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hdfs_55


【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_zookeeper_56

hadoop104 上接收成功

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hadoop_57

5、格式化 zkfc

hdfs zkfc -formatZK

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_zookeeper_58


这时,连上 zookeeper server 后,会多出一个 hadoop-ha,里面是我们之前自定义的逻辑名 qf,而 qf 里暂时没有内容,等我们启动后,将会出现内容

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_big data_59


【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hdfs_60

6、启动 hdfs

在 hadoop102 上:

sbin/start-dfs.sh

7、结果

在 hadoop102 上:

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_zookeeper_61

在 hadoop103 上:

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hdfs_62

在 hadoop104 上:

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_zookeeper_63


对比之前的规划表,完全一致!

hadoop102

hadoop103

hadoop104

NameNode

DataNode

JournalNode

Jps

DFSZKFailoverController

QuorumPeerMain

DataNode

JournalNode

Jps

QuorumPeerMain

NameNode

DataNode

JournalNode

Jps

DFSZKFailoverController

QuorumPeerMain

查看两个 NameNode 的状态情况,一切正常。

【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_big data_64


【Hadoop 3】HDFS 高可用环境搭建(详细图文教程)_hdfs_65

8、补充,完整配置文件内容

core-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
<!-- 指定NameNode的地址 -->
<!--
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:8020</value>
</property> -->

<!--指定hdfs的命名空间-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://qf</value>
</property>

<!-- 指定hadoop数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>

<!-- 配置HDFS网页登录使用的静态用户为atguigu -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>atguigu</value>
</property>

<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
</property>
</configuration>

hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>

<property>
<name>dfs.nameservices</name>
<value>qf</value>
</property>

<property>
<name>dfs.ha.namenodes.qf</name>
<value>nn1,nn2</value>
</property>

<property>
<name>dfs.namenode.rpc-address.qf.nn1</name>
<value>hadoop102:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.qf.nn2</name>
<value>hadoop104:8020</value>
</property>

<property>
<name>dfs.namenode.http-address.qf.nn1</name>
<value>hadoop102:9878</value>
</property>
<property>
<name>dfs.namenode.http-address.qf.nn2</name>
<value>hadoop104:9878</value>
</property>

<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/qf</value>
</property>

<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/module/hadoop-3.1.3/data/journal/data</value>
</property>

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

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

<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>

<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/zlc/.ssh/id_rsa</value>
</property>

<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>

<!-- deny node -->
<property>
<name>dfs.hosts.exclude</name>
<value>/opt/module/hadoop-3.1.3/etc/hadoop/zlc-datanode-deny.list</value>
</property>

</configuration>