一. 实验环境
hadoop1: 192.168.40.144
hadoop2: 192.168.40.145
hadoop3:192.168.40.146
操作系统: centos7
hadoop版本: apache-hadoop-3.2.4
jdk版本:1.8
二. 安装步骤
1. 集群节点角色
主机名 | 角色 |
---|---|
hadoop1 | NameNode, DataNode, JournalNode |
hadoop2 | NameNode, DataNode, JournalNode |
hadoop3 | NameNode, DataNode, JournalNode |
2.安装jdk
jdk的安装过程此处不赘述,不熟悉的话可以参考网上的资料。
3.修改主机映射并配置ssh免密码登录
为了方便配置信息的维护,我们在hadoop配置文件中使用主机名来标识一台主机,那么我们需要在集群中配置主机与ip的映射关系。
修改集群中每台主机/etc/hosts文件,添加如下内容。
192.168.40.144 hadoop1
192.168.40.145 hadoop2
192.168.40.146 hadoop3
集群在启动的过程中需要ssh远程登录到别的主机上,为了避免每次输入对方主机的密码,我们需要对hadoop1配置免密码登录
在hadoop1上生成公钥。
ssh-keygen
一路enter确认即可生成对应的公钥。
将hadoop1的公钥拷贝到hadoop2, hadoop3 节点上。
ssh-copy-id -i ~/.ssh/id_rsa.pub root@hadoop1
ssh-copy-id -i ~/.ssh/id_rsa.pub root@hadoop2
ssh-copy-id -i ~/.ssh/id_rsa.pub root@hadoop3
4.完成配置hadoop配置,并复制到其余节点
下载hadoop 安装包,版本为3.2.4。
-
解压安装包
tar xf hadoop-3.2.4.tar.gz
-
修改etc/hadoop/hadoop-env.sh
export JAVA_HOME=/opt/jdk1.8.0_91
-
修改etc/hadoop/core-site.xml
<property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <!-- 指定Hadoop运行时产生文件的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/hadoop-3.2.4/data</value> </property> <property> <name>ipc.client.connect.max.retries</name> <value>20</value> </property> <property> <name>ipc.client.connect.retry.interval</name> <value>5000</value> </property>
fs.defaultFS这里没有指定具体的namenode,hdfs://mycluster相当于对nn1,nn2和nn3起了一个虚拟名字。在hdfs-site.xml中会对mycluster进行具体的配置。
-
修改etc/hadoop/hdfs-site.xml
<!--配置NameNode,DataNode,JournalNode数据存储的目录 --> <property> <name>dfs.namenode.name.dir</name> <value>file://${hadoop.tmp.dir}/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file://${hadoop.tmp.dir}/data</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>${hadoop.tmp.dir}/journalnode</value> </property> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <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>hadoop1:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>hadoop2:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn3</name> <value>hadoop3:8020</value> </property> <!--Namenode HTTP通信地址--> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>hadoop1:9870</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>hadoop2:9870</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn3</name> <value>hadoop3:9870</value> </property> <!-- journalnode 配置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3: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>
-
修改etc/hadoop/works
hadoop1 hadoop2 hadoop3
-
将配置好的hadoop安装包拷贝到hadoop2和hadoop3上
scp -r /opt/hadoop-3.2.4 root@hadoop1:/opt scp -r /opt/hadoop-3.2.4 root@hadoop2:/opt
5.启动集群
-
启动所有JournalNode
[root@hadoop1 hadoop]# hdfs --daemon start journalnode [root@hadoop2 hadoop]# hdfs --daemon start journalnode [root@hadoop3 hadoop]# hdfs --daemon start journalnode
-
格式化namenode nn1
[root@hadoop1 hadoop]# hdfs namenode -format
-
在nn2 和 nn3同步nn1的元数据信息
[root@hadoop2 hadoop]# hdfs namenode -bootstrapStandby [root@hadoop3 hadoop]# hdfs namenode -bootstrapStandby
-
启动nn2和nn3
[root@hadoop2 hadoop]# hdfs --daemon start namenode [root@hadoop3 hadoop]# hdfs --daemon start namenode
-
启动datanode
[root@hadoop1 hadoop]# hdfs --daemon start datanode [root@hadoop2 hadoop]# hdfs --daemon start datanode [root@hadoop3 hadoop]# hdfs --daemon start datanode
-
查看web界面,此时三个namenode处于standby状态
-
将nn1切换为active状态
[root@hadoop1 hadoop-3.2.4]# hdfs haadmin -transitionToActive nn1 # 查看所有namenode的状态 [root@hadoop1 hadoop-3.2.4]# hdfs haadmin -getAllServiceState hadoop1:8020 active hadoop2:8020 standby hadoop3:8020 standby
-
再次查看web界面,此时nn1处于active状态,nn2 和 nn3处于standby状态
6.验证HDFS功能
# 向HDFS集群上传文件
[root@hadoop1 hadoop-3.2.4]# hdfs dfs -put a.txt /input
[root@hadoop1 hadoop-3.2.4]# hdfs dfs -ls /input
Found 1 items
-rw-r--r-- 3 root supergroup 0 2022-08-24 19:56 /input/a.txt
三. HA手工切换
-
手动将active 节点从nn1 切换到 nn2
[root@hadoop1 hadoop-3.2.4]# hdfs haadmin -failover nn1 nn2 Failover from nn1 to nn2 successful
-
查看web界面,此时nn2处于active状态,nn1和nn3处于standby状态
-
再次验证HDFS功能
# 向HDFS集群上传文件 [root@hadoop1 hadoop-3.2.4]# hdfs dfs -put b.txt /input [root@hadoop1 hadoop-3.2.4]# hdfs dfs -ls /input Found 2 items -rw-r--r-- 3 root supergroup 0 2022-08-24 19:56 /input/a.txt -rw-r--r-- 3 root supergroup 0 2022-08-24 20:05 /input/b.txt