企业项目实战hadoop篇---hadoop高可用集群部署(二)

一.hadoop高可用集群概述

在典型的 HA 集群中,通常有两台不同的机器充当 NN。在任何时间,只有一台机器处于Active 状态;另一台机器是处于 Standby 状态。Active NN 负责集群中所有客户端的操作;而 Standby NN 主要用于备用,它主要维持足够的状态,如果必要,可以提供快速的故障恢复。

为了让 Standby NN 的状态和 Active NN 保持同步,即元数据保持一致,它们都将会和JournalNodes 守护进程通信。当 Active NN 执行任何有关命名空间的修改,它需要持久化到一半以上的 JournalNodes 上(通过 edits log 持久化存储),而 Standby NN 负责观察 edits log的变化,它能够读取从 JNs 中读取 edits 信息,并更新其内部的命名空间。一旦 Active NN出现故障,Standby NN 将会保证从 JNs 中读出了全部的 Edits,然后切换成 Active 状态。

Standby NN 读取全部的 edits 可确保发生故障转移之前,是和 Active NN 拥有完全同步的命名空间状态。
为了提供快速的故障恢复,Standby NN 也需要保存集群中各个文件块的存储位置。为了实现这个,集群中所有的 Database 将配置好 Active NN 和 Standby NN 的位置,并向它们发送块文件所在的位置及心跳,如下图所示:
在这里插入图片描述
在任何时候,集群中只有一个 NN 处于 Active 状态是极其重要的。否则,在两个 Active NN的状态下 NameSpace 状态将会出现分歧,这将会导致数据的丢失及其它不正确的结果。为了保证这种情况不会发生,在任何时间,JNs 只允许一个 NN 充当 writer。在故障恢复期间,将要变成 Active 状态的 NN 将取得 writer 的角色,并阻止另外一个 NN 继续处于 Active状态。

为了部署 HA 集群,你需要准备以下事项:

  • NameNode machines:运行 Active NN 和 Standby NN 的机器需要相同的硬件配置;
  • JournalNode machines:也就是运行 JN 的机器。JN 守护进程相对来说比较轻量,所以这些守护进程可以可其他守护线程(比如 NN,YARN ResourceManager)运行在同一台机器上。在一个集群中,最少要运行 3 个 JN 守护进程,这将使得系统有一定的容错能力。当然,你也可以运行 3 个以上的 JN,但是为了增加系统的容错能力,你应该运行奇数个 JN(3、5、7 等),当运行 N 个 JN,系统将最多容忍(N-1)/2 个 JN 崩溃。

在 HA 集群中,Standby NN 也执行 namespace 状态的 checkpoints,所以不必要运行Secondary NN、CheckpointNode 和 BackupNode;事实上,运行这些守护进程是错误的。

二.部署说明

server2/3/4 搭建ZK集群、JN集群、DN集群
server1/5 搭建NN高可用

三.Zookeeper 集群搭建

Zookeeper 集群至少三台,总节点数为奇数个

执行脚本,停止hadoop

[hadoop@server1 hadoop]$ sbin/stop-all.sh
WARNING: Stopping all Apache Hadoop daemons as hadoop in 10 seconds.
WARNING: Use CTRL-C to abort.
Stopping namenodes on [server1]
Stopping datanodes
Stopping secondary namenodes [server1]
Stopping nodemanagers
Stopping resourcemanager
[hadoop@server1 hadoop]$ jps
16622 Jps

删除server1/2/3/4tmp目录内hadoop配置文件

[hadoop@server1 hadoop]$ rm -rf /tmp/*
[hadoop@server1 hadoop]$ ls /tmp/

解压zookeeper-3.4.9.tar.gz ,进入目录

[hadoop@server1 ~]$ tar zxf zookeeper-3.4.9.tar.gz 
[hadoop@server1 ~]$ ls
anaconda-ks.cfg  hadoop-3.2.1.tar.gz  jdk-8u181-linux-x64.tar.gz
hadoop           java                 zookeeper-3.4.9
hadoop-3.2.1     jdk1.8.0_181         zookeeper-3.4.9.tar.gz
[hadoop@server1 ~]$ cd zookeeper-3.4.9/
[hadoop@server1 zookeeper-3.4.9]$ ls
bin          dist-maven       LICENSE.txt           src
build.xml    docs             NOTICE.txt            zookeeper-3.4.9.jar
CHANGES.txt  ivysettings.xml  README_packaging.txt  zookeeper-3.4.9.jar.asc
conf         ivy.xml          README.txt            zookeeper-3.4.9.jar.md5
contrib      lib              recipes               zookeeper-3.4.9.jar.sha1

复制模板文件

[hadoop@server1 zookeeper-3.4.9]$ cd conf/
[hadoop@server1 conf]$ ls
configuration.xsl  log4j.properties  zoo_sample.cfg
[hadoop@server1 conf]$ cp zoo_sample.cfg  zoo.cfg
[hadoop@server1 conf]$ ls
configuration.xsl  log4j.properties  zoo.cfg  zoo_sample.cfg

修改zoo.cfg ,加入zk集群节点

[hadoop@server1 conf]$ vim zoo.cfg 
server.1=172.25.3.2:2888:3888
server.2=172.25.3.3:2888:3888
server.3=172.25.3.4:2888:3888

在这里插入图片描述
server1/2/3/4创建/tmp/zookeeper目录,存放zk集群信息

[hadoop@server1 conf]$ mkdir /tmp/zookeeper

server2 写入myid文件,序号为1

[hadoop@server2 ~]$ mkdir /tmp/zookeeper
[hadoop@server2 ~]$ echo 1 >/tmp/zookeeper/myid

server3 写入myid文件,序号为2

[hadoop@server3 ~]$ mkdir /tmp/zookeeper
[hadoop@server3 ~]$ echo 2 > /tmp/zookeeper/myid

server4 写入myid文件,序号为3

[hadoop@server4 hadoop]$ mkdir /tmp/zookeeper
[hadoop@server4 hadoop]$ echo 3 > /tmp/zookeeper/myid
[hadoop@server4 hadoop]$ cat /tmp/zookeeper/myid 
3

在各节点启动服务,依次执行启动命令

server2 Mode: follower

[hadoop@server2 zookeeper-3.4.9]$ bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/hadoop/zookeeper-3.4.9/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[hadoop@server2 zookeeper-3.4.9]$ bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/hadoop/zookeeper-3.4.9/bin/../conf/zoo.cfg
Mode: follower

server3 Mode: follower

[hadoop@server3 zookeeper-3.4.9]$ bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/hadoop/zookeeper-3.4.9/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[hadoop@server3 zookeeper-3.4.9]$ bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/hadoop/zookeeper-3.4.9/bin/../conf/zoo.cfg
Mode: follower
[hadoop@server3 zookeeper-3.4.9]$ jps
4338 QuorumPeerMain
4868 Jps

在这里插入图片描述

server4 Mode: leader

[hadoop@server4 zookeeper-3.4.9]$ bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/hadoop/zookeeper-3.4.9/bin/../conf/zoo.cfg
Starting zookeeper ... already running as process 14930.
[hadoop@server4 zookeeper-3.4.9]$ bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/hadoop/zookeeper-3.4.9/bin/../conf/zoo.cfg
Mode: leader

在这里插入图片描述

四.Hadoop 配置及高可用搭建

创建高可用节点server5

安装nfs

[root@server5 ~]# yum install -y nfs-utils.x86_64 
[root@server5 ~]# systemctl enable  --now nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.

创建hadoop用户

[root@server5 ~]# useradd hadoop

挂载 172.25.3.1:/home/hadoop/

[root@server5 ~]# mount 172.25.3.1:/home/hadoop/ /home/hadoop/
[root@server5 ~]# su - hadoop 
[hadoop@server5 ~]$ ls
anaconda-ks.cfg  hadoop-3.2.1         java          jdk-8u181-linux-x64.tar.gz  zookeeper-3.4.9.tar.gz
hadoop           hadoop-3.2.1.tar.gz  jdk1.8.0_181  zookeeper-3.4.9

修改core-site.xml

[hadoop@server1 hadoop]$ vim core-site.xml 
<configuration>
<!-- 指定 hdfs 的 namenode 为 masters (名称可自定义)-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://masters</value>
</property>
<!-- 指定 zookeeper 集群主机地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>172.25.3.2:2181,172.25.3.3:2181,172.25.3.4:2181</value>
</property>
</configuration>

在这里插入图片描述
编辑 hdfs-site.xml 文件

[hadoop@server1 hadoop]$ vim hdfs-site.xml 
<configuration>
<!-- 指定 hdfs 的 nameservices 为 masters,和 core-site.xml 文件中的设置保持一
致 -->
<property>
<name>dfs.nameservices</name>
<value>masters</value>
</property>
<!-- masters 下面有两个 namenode 节点,分别是 h1 和 h2 (名称可自定义)
-->
<property>
<name>dfs.ha.namenodes.masters</name>
<value>h1,h2</value>
</property>
<!-- 指定 h1 节点的 rpc 通信地址 -->
<property>
<name>dfs.namenode.rpc-address.masters.h1</name>
<value>172.25.3.1:9000</value>
</property>
<!-- 指定 h1 节点的 http 通信地址 -->
<property>
<name>dfs.namenode.http-address.masters.h1</name>
<value>172.25.3.1:50070</value>
</property>
<!-- 指定 h2 节点的 rpc 通信地址 -->
<property>
<name>dfs.namenode.rpc-address.masters.h2</name>
<value>172.25.3.5:9000</value>
</property>
<!-- 指定 h2 节点的 http 通信地址 -->
<property>
<name>dfs.namenode.http-address.masters.h2</name>
<value>172.25.3.5:50070</value>
</property>
<!-- 指定 NameNode 元数据在 JournalNode 上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://172.25.3.2:8485;172.25.3.3:8485;172.25.3.4:8485/masters</value>
</property>
<!-- 指定 JournalNode 在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/tmp/journaldata</value></property>
<!-- 开启 NameNode 失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.masters</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvid
er</value>
</property>
<!-- 配置隔离机制方法,每个机制占用一行-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用 sshfence 隔离机制时需要 ssh 免密码 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- 配置 sshfence 隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>

在三个 DN server2/3/4上依次启动 journalnode(第一次启动 hdfs 必须先启动 journalnode)

[hadoop@server4 hadoop]$ bin/hdfs --daemon start journalnode
[hadoop@server4 hadoop]$ jps
15185 Jps
14930 QuorumPeerMain
15167 JournalNode

格式化 hadoop 集群

[hadoop@server1 hadoop]$ bin/hdfs namenode -format
2021-08-15 04:03:50,454 INFO namenode.NameNode: STARTUP_MSG: 
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = server1/172.25.3.1
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 3.2.1
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at server1/172.25.3.1
************************************************************/

将server1内/tmp下的hadoop配置信息传递到server5

[hadoop@server1 hadoop]$ scp -r /tmp/hsperfdata_hadoop/ hadoop@172.25.3.5:/tmp

格式化 zookeeper

[hadoop@server1 hadoop]$ bin/hdfs zkfc -formatZK
2021-08-15 04:07:02,048 INFO tools.DFSZKFailoverController: STARTUP_MSG: 
/************************************************************
STARTUP_MSG: Starting DFSZKFailoverController
STARTUP_MSG:   host = server1/172.25.3.1
STARTUP_MSG:   args = [-formatZK]
STARTUP_MSG:   version = 3.2.1
2021-08-15 04:07:02,568 INFO tools.DFSZKFailoverController: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down DFSZKFailoverController at server1/172.25.3.1
************************************************************/

启动 hdfs 集群

[hadoop@server1 hadoop]$ sbin/start-dfs.sh
Starting namenodes on [server1 server5]
server5: Warning: Permanently added 'server5' (ECDSA) to the list of known hosts.
Starting datanodes
Starting journal nodes [server4 server3 server2]
server3: journalnode is running as process 4940.  Stop it first.
server4: journalnode is running as process 15167.  Stop it first.
server2: journalnode is running as process 4612.  Stop it first.
Starting ZK Failover Controllers on NN hosts [server1 server5]

查看server1/5 信息

[hadoop@server1 hadoop]$ jps
17602 DFSZKFailoverController
17654 Jps
17246 NameNode

查看server2/3/4 信息

[hadoop@server2 hadoop]$ jps
4612 JournalNode
4759 DataNode
4878 Jps
4367 QuorumPeerMain

进入bin/zkCli.sh,查看集群信息

[hadoop@server2 zookeeper-3.4.9]$ bin/zkCli.sh
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper, hadoop-ha]
[zk: localhost:2181(CONNECTED) 1] ls /hadoop-ha
[masters]
[zk: localhost:2181(CONNECTED) 2] ls /hadoop-ha/masters
[ActiveBreadCrumb, ActiveStandbyElectorLock]
[zk: localhost:2181(CONNECTED) 3] ls /hadoop-ha/masters/Active

ActiveBreadCrumb           ActiveStandbyElectorLock
[zk: localhost:2181(CONNECTED) 3] ls /hadoop-ha/masters/ActiveBreadCrumb
[]
[zk: localhost:2181(CONNECTED) 4] get /hadoop-ha/masters/ActiveBreadCrumb

mastersh2server1 �F(�>
cZxid = 0x100000009
ctime = Sun Aug 15 04:07:22 EDT 2021
mZxid = 0x10000000e
mtime = Sun Aug 15 04:10:05 EDT 2021
pZxid = 0x100000009
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 28
numChildren = 0

访问 172.25.3.1:9870
server1状态为active 主节点

在这里插入图片描述

server5状态为standby 备用节点
在这里插入图片描述

查看目录内容,文件有三个备份版本
在这里插入图片描述

五.故障自动切换

关闭 NameNode进程

[hadoop@server1 hadoop]$ jps
17602 DFSZKFailoverController
17674 Jps
17246 NameNode
[hadoop@server1 hadoop]$ kill 17246
[hadoop@server1 hadoop]$ jps
17602 DFSZKFailoverController
17706 Jps

查看主节点切换
在这里插入图片描述
重载server1节点

[hadoop@server1 hadoop]$ sbin/hadoop-daemon.sh start namenode
WARNING: Use of this script to start HDFS daemons is deprecated.
WARNING: Attempting to execute replacement "hdfs --daemon start" instead.
[hadoop@server1 hadoop]$ jps
17602 DFSZKFailoverController
17779 NameNode
17854 Jps

查看server1状态
在这里插入图片描述
查看集群信息,主节点显示server5
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值