Hadoop-HA 高可用集群环境搭建
1. 目标环境
节点NameNode01NameNode02DataNodeZookeeperZKFCJouralNodenode01✔✔✔✔✔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
在文件末尾添加以下内容:
exportJAVA_HOME=/usr/java/jdk1.8.0_351-amd64
exportHDFS_NAMENODE_USER=root
exportHDFS_DATANODE_USER=root
exportHDFS_ZKFC_USER=root
exportHDFS_JOURNALNODE_USER=root
exportYARN_RESOURCEMANAGER_USER=root
exportYARN_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
,在文件末尾添加以下内容:
exportHADOOP_HOME=/opt/yjx/hadoop-3.3.4
exportPATH=$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。
版权归原作者 白上惯风 所有, 如有侵权,请联系我们删除。