Hadoop HA高可用部署-手动模式
1.配置HDFS-HA集群
1)在/opt目录下创建一个ha的目录
[root@hadoop01 ~]#cd /opt/
[root@hadoop01 ~]#mkdir ha
2)将/opt/module/下的 hadoop拷贝到/opt/ha目录下
[root@hadoop01 ~]# cp -rv /opt/module/hadoop-3.3.1/ /opt/ha/
3)给ha目录授予myhadoop用户权限
[root@hadoop01 ~]# chown -R myhadoop:myhadoop /opt/
4)切换到myhadoop用户
[root@hadoop01 ~]# su - myhadoop
[root@node1 ~]$
5)配置core-site.xml
[root@node1 ~]$ vim /opt/ha/hadoop-3.3.1/etc/hadoop/core-site.xml
<configuration>
<!-- 指定 NameNode 的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 指定 hadoop 数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/ha/hadoop-3.3.1/data/tmp</value>
</property>
<!-- 声明journalnode服务器存储目录-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>file://${hadoop.tmp.dir}/jn</value>
</property>
<!-- 配置 HDFS 网页登录使用的静态用户为 myhadoop -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
</configuration>
6)配置hdfs-site.xml
<configuration>
<!-- 完全分布式集群名称 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- NameNode数据存储目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.tmp.dir}/name</value>
</property>
<!-- DataNode数据存储目录 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.tmp.dir}/data</value>
</property>
<!--集群中NameNode节点都有哪些 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2,nn3</value>
</property>
<!--nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node1:9000</value>
</property>
<!--nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node2:9000</value>
</property>
<!-- nn3的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn3</name>
<value>node3:9000</value>
</property>
<!--nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node1:9870</value>
</property>
<!--nn2的http通信地址-->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node2:9870</value>
</property>
<!-- nn3的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn3</name>
<value>node3:9870</value>
</property>
<!-- 指定NameNode元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</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>
<!-- 访问代理类: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.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
7)拷贝配置好的hadoop环境到其他节点(使用xsync脚本)
[root@node1 ~]$sudo xsync /opt/ha
2.启动HDFS-HA集群
1)修改hadooop的环境变量,指向HA的集群
[root@node1 ~]$ sudo vim /etc/profile.d/my_env.sh
export HADOOP_HOME=/opt/ha/hadoop-3.3.1
2)分发文件
[root@node1 ~]$ sudo xsync /etc/profile.d/my_env.sh
3)在各个节点刷新环境变量
[root@node1 ~]$ source /etc/profile
[root@node2 ~]$ source /etc/profile
[root@node3 ~]$ source /etc/profile
4)在各个节点上删除/tmp目录下的内容
[myhadoop@node1 ~]$ sudo rm -rf /tmp/*
[myhadoop@node2 ~]$ sudo rm -rf /tmp/*
[myhadoop@node3 ~]$ sudo rm -rf /tmp/*
5)在各个JournalNode节点上,输入以下命令启动journalnode服务
[root@node1 ~]$ hdfs --daemon start journalnode
[root@node2 ~]$ hdfs --daemon start journalnode
[root@node3 ~]$ hdfs --daemon start journalnode
[root@node1 ~]$ jpsall
=============== hadoop01 ===============
1774 Jps
1727 JournalNode
=============== hadoop02 ===============
2485 Jps
2439 JournalNode
=============== hadoop03 ===============
2698 Jps
2653 JournalNode
6)在nn1上,对namenode进行格式化,并启动
[root@node1 ~]$ hdfs namenode -format
[root@node1 ~]$ hdfs --daemon start namenode
[root@node1 ~]$ jps
1909 NameNode
1977 Jps
1727 JournalNode
7)在nn2和nn3上,同步nn1的元数据信息
[root@node2 ~]$ hdfs namenode -bootstrapStandby
[root@node3 ~]$ hdfs namenode -bootstrapStandby
8)启动nn2和nn3上的namenode服务
[root@node2 ~]$ hdfs --daemon start namenode
[root@node2 ~]$ jps
2786 Jps
2439 JournalNode
2714 NameNode
[root@node3 ~]$ hdfs --daemon start namenode
[root@node3 ~]$ jps
2918 NameNode
3002 Jps
2653 JournalNode
9)在web页面显示,01 02 03 都为standby状态
Overview ‘hadoop01:9000’ (standby)
Overview ‘hadoop02:9000’ (standby)
Overview ‘hadoop03:9000’ (standby)
10)启动所有节点的datanode服务
[root@node1 ~]$ hdfs --daemon start datanode
[root@node1 ~]$ jps
1909 NameNode
2203 DataNode
1727 JournalNode
2271 Jps
[root@node2 ~]$ hdfs --daemon start datanode
[root@node2 ~]$ jps
2439 JournalNode
2714 NameNode
2938 DataNode
3020 Jps
[root@node3 ~]$ hdfs --daemon start datanode
[root@node3 ~]$ jps
3219 Jps
3141 DataNode
2918 NameNode
2653 JournalNode
11)将nn1切换为Active状态
[root@node1 ~]$ hdfs haadmin -transitionToActive nn1
Overview ‘hadoop01:9000’ (active)
12)命令验证是否为Active
[root@node1 ~]$ hdfs haadmin -getServiceState nn1
active
13)kill掉Active的NameNode,进行手动故障转移
[root@node1 ~]$ jps
1909 NameNode
2203 DataNode
2588 Jps
1727 JournalNode
[root@node1 ~]$ kill -9 1909
14)在nn2上切换为Active
[root@node2 ~]$ hdfs haadmin -transitionToActive nn2 --forceactive
[root@node2 ~]$ hdfs haadmin -getServiceState nn2
active
15)恢复nn1上的namenode服务切换为active
[root@node1 ~]$ hdfs haadmin -transitionToActive --forceactive nn1
[root@node1 ~]$ hdfs haadmin -getServiceState nn1
active
16)查看nn2上的状态:namenode服务掉了
[root@node2 ~]$ jps
2439 JournalNode
2938 DataNode
4412 Jps
[root@node3 ~]$ hdfs --daemon start datanode
[root@node3 ~]$ jps
3219 Jps
3141 DataNode
2918 NameNode
2653 JournalNode
[root@node3 ~]$ hdfs haadmin -getServiceState nn2
standby