Hadoop-HA 高可用集群环境搭建

在这里插入图片描述

1. 目标环境

节点 NameNode01 NameNode02 DataNode Zookeeper ZKFC JouralNode
node01
node02
node03

2. 安装

2.1 解压即安装

将准备好的安装包上传至 node01,然后解压:

tar -zxvf hadoop-3.3.4.tar.gz -C /opt/yjx/
rm hadoop-3.3.4.tar.gz -rf
2.2 修改配置文件

修改环境配置文件 hadoop-env.sh

cd /opt/yjx/hadoop-3.3.4/etc/hadoop/
vim hadoop-env.sh

在文件末尾添加以下内容:

export JAVA_HOME=/usr/java/jdk1.8.0_351-amd64
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_ZKFC_USER=root
export HDFS_JOURNALNODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

修改核心配置文件 core-site.xml

vim core-site.xml

configuration 节点中添加以下内容:

<!--设置 NameNode 节点的 URI(包括协议、主机名称、端口号),用于 NameNode 与 DataNode 之间的通讯-->
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://hdfs-yjx</value>
</property>
        <!--设置 Hadoop 运行时临时文件的存放位置,比如 HDFS 的 NameNode 数据默认都存放这个目录下-->
<property>
<name>hadoop.tmp.dir</name>
<value>/var/yjx/hadoop/ha</value>
</property>
        <!-- 设置在 Web 界面访问数据时使用的用户名 -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
        <!-- 设置 HA,需要一组 ZK 地址,以逗号分隔。被 ZKFailoverController 使用于自动失效备援 failover -->
<property>
<name>ha.zookeeper.quorum</name>
<value>node01:2181,node02:2181,node03:2181</value>
</property>
        <!-- 该参数表示可以通过 httpfs 接口访问 HDFS 的 IP 地址限制 -->
        <!-- 配置 root(超级用户) 允许通过 httpfs 方式访问 HDFS 的主机名、域名 -->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
        <!-- 通过 httpfs 接口访问的用户获得的群组身份 -->
        <!-- 配置允许通过 httpfs 方式访问的客户端的用户组 -->
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>

hadoop.tmp.dir 属性的默认值为 /tmp/hadoop-${user.name} ,NameNode 会将 HDFS 的元数据存储在这个/tmp 目录下,如果操作系统重启了,系统会清空 /tmp,导致 NameNode 元数据丢失,是个非常严重的问题,所以我们需要修改此路径。

hadoop.http.staticuser.user=dr.who 默认值是一个不真实存在的用户,此用户权限非常小,不能访问不同用户的数据,但是这保证了数据的安全。也可以设置为 hdfs 和 hadoop 等具有较高权限的用户,但会导致能够登陆网页 界面的人会看到其它用户的数据。实际设置请综合考虑,如无特殊需求,使用默认值就好。

修改 HDFS 配置文件 hdfs-site.xml

vim hdfs-site.xml

configuration 节点中添加以下内容:

<!-- 设置 nameservices 列表(联邦列表),逗号分隔 -->
<property>
<name>dfs.nameservices</name>
<value>hdfs-yjx</value>
</property>
<!-- 设置一个 NameNode 列表。hdfs-yjx 是指具体的 nameservice 名称,通常就是 dfs.nameservices 中配置的。值
是预备配置的 NameNode 的 ID,ID 是自己取的,不重复就可以,例如 nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.hdfs-yjx</name>
<value>nn1,nn2</value>
</property>
<!-- 设置 NameNode 的 RPC 地址和端口 -->
<property>
<name>dfs.namenode.rpc-address.hdfs-yjx.nn1</name>
<value>node01:8020</value>
</property>
<!-- 设置 NameNode 的 RPC 地址和端口 -->
<property>
<name>dfs.namenode.rpc-address.hdfs-yjx.nn2</name>
<value>node02:8020</value>
</property>
<!-- 设置 NameNode 的 HTTP 地址和端口 -->
<property>
<name>dfs.namenode.http-address.hdfs-yjx.nn1</name>
<value>node01:9870</value>
</property>
<!-- 设置 NameNode 的 HTTP 地址和端口 -->
<property>
<name>dfs.namenode.http-address.hdfs-yjx.nn2</name>
<value>node02:9870</value>
</property>
<!-- 设置 QJM 共享存储系统服务器。在多个 NameNode 中共享存储目录,用于存放 edits 文件,该目录由 Active 写,
Standby 读 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node01:8485;node02:8485;node03:8485/hdfs-yjx</value>
</property>
<!-- 设置 journalnode 用于存放 edits 日志的目录,默认值为 /tmp/hadoop/dfs/journalnode -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/yjx/hadoop/ha/qjm</value>
</property>
<!-- 设置客户端连接 Active NameNode 所用的代理类 -->
<property>
<name>dfs.client.failover.proxy.provider.hdfs-yjx</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 设置 HDFS-HA 功能的防脑裂方法。可以是内建的方法(例如 shell 和 sshfence)或者用户自定义的方法 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
<value>shell(true)</value>
</property>
<!-- 设置失效转移时使用的秘钥文件 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 设置故障转移功能是否开启,建议开启 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 设置 HDFS 默认的数据块副本数。可以在创建文件时指定,如果创建时未指定,则使用默认值 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>

修改 workers

vim workers

用以下内容替换文件内容:

node01
node02
node03
2.3 拷贝至其他节点

将 node01 已配置好的 hadoop 拷贝至 node02 和 node03。

[root@node02 ~]# scp -r root@node01:/opt/yjx/hadoop-3.3.4 /opt/yjx/
[root@node03 ~]# scp -r root@node01:/opt/yjx/hadoop-3.3.4 /opt/yjx/

# 或者使用分发脚本
[root@node01 ~]# yjxrsync /opt/yjx/hadoop-3.3.4/
2.4 修改环境变量

三个节点修改环境变量 vim /etc/profile ,在文件末尾添加以下内容:

export HADOOP_HOME=/opt/yjx/hadoop-3.3.4
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

修改完成后 source /etc/profile 重新加载环境变量。

3. 启动

首先启动 ZooKeeper(三台机器都需要执行)。

zkServer.sh start
zkServer.sh status

# 或者用一键启动脚本
zookeeper start

然后启动 JournalNode(三台机器都需要执行)。

hdfs --daemon start journalnode

最后格式化 NameNode 等相关服务并启动集群。

# 格式化 node01 的 namenode(第一次配置的情况下使用)
[root@node01 ~]# hdfs namenode -format
# 启动 node01 的 namenode
[root@node01 ~]# hdfs --daemon start namenode

# node02 节点同步镜像数据
[root@node02 ~]# hdfs namenode -bootstrapStandby

# 格式化 zkfc(第一次配置的情况下使用)
[root@node01 ~]# hdfs zkfc -formatZK
# 启动 HDFS
[root@node01 ~]# start-dfs.sh

后期只需要先启动 ZooKeeper 然后再启动 HDFS 即可。

4. 访问

访问:http://192.168.177.101:9870/ 和 http://192.168.177.102:9870/

在这里插入图片描述

在这里插入图片描述

5. 测试文件上传

hdfs dfs -mkdir -p /test
hdfs dfs -put hadoop-3.3.4.tar.gz /test
# 指定 Block 大小
hdfs dfs -D dfs.blocksize=134217728 -put hadoop-3.3.4.tar.gz /test

6. 关闭

先关闭 HDFS。

stop-dfs.sh

再关闭 ZooKeeper(三台机器都需要执行)。

zkServer.sh stop

# 或者一键关闭脚本
zookeeper stop

环境搭建成功后 shutdown -h 0 关机拍摄快照ZooKeeper。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐