文章目录
- 1.1 软件版本说明
- 1.2 集群配置说明
- 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 路径的授权部分的值。
(参考官方)
2、修改 hdfs-site.xml
(1)为此名称服务选择一个逻辑名称(与上面的 core-site.xml 中 fd.defaultFS 属性对应的 value 值对应),它将用于配置和集群中绝对 HDFS 路径的权限组件。
(参考官方)
(2)使用逗号分隔的 NameNode ID 列表进行配置。DataNode 将使用它来确定集群中的所有 NameNode,并使用“nn1”和“nn2”作为 NameNode 的单个 ID。
(参考官方)
(3)配置每个 NameNode 监听的完全限定的 RPC 地址,用于 NameNode 的内部通信地址,对于之前配置的两个 NameNode ID,设置 NameNode 进程的完整地址和 IPC 端口。(参考官方)
(4)配置每个 NameNode 监听的完全限定的 HTTP 地址,用于 NameNode 的 web ui 的通信地址,与上面的 rpc-address 类似,设置两个 NameNode 的 HTTP 服务器的地址以进行侦听。
(参考官方)
(5)配置提供共享编辑存储的 JournalNode 的地址。
(参考官方)
(6)指定 NameNode 失败后进行自动切换的主类。
(7)出现 “脑裂” 后,采取某种方式杀死其中一个 NameNode;同时也要配置 shh 免密,不然会要求输入密码,将可能导致杀死失败而且还有人工手动操作的麻烦;还可配置杀死超时时间,若超过此时间仍未杀死另一个处于 Active 的 NameNode,那么则报超时。(参考官方)
(8)JournalNode 守护进程将存储其本地状态的路径,即 JournalNode 的本地共享目录。(参考官方)
(9)配置自动故障转移。(参考官方)
注意,下图是在 core-site.xml 中添加:
(10)将此配置分发给集群中的其他机器(此 xsync 脚本是封装的 shell 命令,具体可参考之前搭建 hadoop 完全分布式环境的文章)。
3.2 zookeeper 的安装与配置
1、下载并解压 zookeeper
2、配置环境变量
3、自定义 zoo.cfg 配置
(参考官方)
关于此配置,zookeeper 的官网也有详细介绍:链接地址
4、分发 zookeeper 给其他客户机(1)分发 PATH 配置
(2)分发 Zookeeper
在 hadoop102 上:
在 hadoop103 上:
在 hadoop104 上:
(3)创建在 zoo.cfg 中 dataDir 属性指定的目录也要在上面 dataDir 属性指定的值中创建相应的目录,用来存储 zookeeper 的数据
也要讲 zkdata 目录分发给其他客户机
(4)创建并配置 myid 文件在 hadoop102 上:
在 hadoop103 上:
在 hadoop104 上:
3.3 启动测试
1、在各节点上启动 zookeeper(只要有半数以上的机器启动 zookeeper 就可以发挥作用),启动后,各节点都应该有 QuorumPeerMain 进程
(1)启动 zookeeper
(2)查看 zookeeper 运行情况
2、启动 journalnode 服务,此时,各节点的 JournalNode 进程都应该已经启动成功
sbin/hadoop-daemons.sh start journalnode
3、挑选两个 NameNode 之中的一台来格式化,然后启动
(格式化方式可参考之前文章,但是,请注意,此处 HDFS 高可用环境下的 namenode 格式化要先启动 zookeeper 和 journalnode:【Hadoop 3】集群管理:集群中结点的添加、删除(图文总结))
4、将数据目录复制到另一台 NameNode 的机器(hadoop104)上
采取复制方式
scp -r data/ hadoop104:/opt/module/hadoop-3.1.3/
在 hadoop102 上执行复制操作,复制给另一台配置 NameNode 进程的主机 hadoop104
hadoop104 上接收成功
5、格式化 zkfc
这时,连上 zookeeper server 后,会多出一个 hadoop-ha,里面是我们之前自定义的逻辑名 qf,而 qf 里暂时没有内容,等我们启动后,将会出现内容
6、启动 hdfs
在 hadoop102 上:
7、结果
在 hadoop102 上:
在 hadoop103 上:
在 hadoop104 上:
对比之前的规划表,完全一致!
| hadoop102
| hadoop103
| hadoop104
|
| NameNode DataNode
JournalNode
Jps
DFSZKFailoverController
QuorumPeerMain
| DataNode
JournalNode
Jps
QuorumPeerMain
| NameNode DataNode
JournalNode
Jps
DFSZKFailoverController
QuorumPeerMain
|
查看两个 NameNode 的状态情况,一切正常。
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>