学习基于阿里云 ECS 云服务器搭建大数据集群的笔记。笔记将搭建步骤和遇到的问题一一记录,用于自己查阅复习,也为小伙伴们提供一定参考帮助。
本篇是笔记的第三部分。上篇笔记完成了HDFS 全分布集群搭建。本篇将继续实现基于 ZooKeeper 的高可用集群搭建。
基于 ZooKeeper 的高可用 HDFS 集群搭建
集群架构
集群使用 4 台云服务器搭建,各节点角色如下:
NN-1 | NN-2 | DN | ZK | ZKFC | JNN | |
---|---|---|---|---|---|---|
Node00 | * | * | * | |||
Node01 | * | * | * | * | * | |
Node02 | * | * | * | |||
Node03 | * | * |
准备工作
关闭集群
在 node00 使用命令stop-dfs.sh
关闭集群。
准备 ZooKeeper 安装包
上传到 node00/root/softwares
目录下备用。我使用的版本是 ZooKeeper 3.4.6。
配置基于 QJM 的高可用
QJM 的全称是 Quorum Journal Manager,用于在 Active NameNode 和 NameNode Standby 之间同步数据。
配置 hdfs-site.xml
打开/opt/hadoop/hadoop-2.6.5/etc/hadoop
目录下的hdfs-site.xml
文件。
删除 Secondary NameNode 配置
由于已经不再需要 SNN,我们首先将hdfs-site.xml
配置文件中关于 SNN 的配置删除。
配置 nameservices 逻辑名称
将 NameNode 归属到同一 NameService 才能实现主节点间的数据同步。我们首先为 NameService 配置逻辑名称,并在随后为 NameService 添加节点。
在配置中添加:
1 | <property> |
其中 NameService 的名称mycluster
可以随意指定。这里使用的是官网文档中的命名。如果需要配置联邦,这一项中可以同时配置多个 NameService 逻辑名称(使用逗号隔开)。
配置 mycluster 下 NameNode 逻辑名称
在配置中添加:
1 | <property> |
这一步为 mycluster 添加了两个逻辑节点 nn1 和 nn2。我们将在稍后为这两个逻辑节点指定具体的物理节点。
Hadoop 2.x 版本中,一个 NameService 只支持两个 NameNode
指定 NameNodes
在配置中添加:
1 | <property> |
rpc 是远程服务调用(remote procedure call)的缩写
配置 http 端口
在配置中添加:
1 | <property> |
这一步的配置是为了能够通过浏览器可视化监控集群运作情况
配置 JN 主机位置
集群工作时,Active NameNode 将会向 JN 中写入 edits 数据,而 Standby 将会读取。这一步我们要指定 JN 主机位置。
在配置中添加:
1 | <property> |
配置代理类
直接照抄官方文档:
1 | <property> |
配置 Fencing Method
故障发生时 ANN 可能仍然在从 Client 读取数据并写入 edits,从而导致脑裂(split brain)。因此需要配置一种故障隔离方法。
在配置中添加:
1 | <property> |
配置 JN 日志文件保存位置
在配置中添加:
1 | <property> |
配置 core-site.dfs
打开/opt/hadoop/hadoop-2.6.5/etc/hadoop
目录下的core-site.xml
文件。
配置 fs.defaultFS
我们的主节点不再是 node00 单节点,而是名为 mycluster 的逻辑节点。修改配置如下:
1 | <property> |
修改 hadoop.tmp.dir
将 full 修改为 ha。
基于 ZooKeeper 的自动故障转移
经过上一段的配置,集群已经可以通过手动方式进行故障转移了。具体操作的方法可以在官方文档找到。接下来我们要配置基于 ZooKeeper 的自动故障转移。
注意此时我们还没有进行 ZooKeeper 的安装,只是先行在 HDFS 中完成配置
配置 HDFS
打开自动故障转移功能
在hdfs-site.xml
中增加配置:
1 | <property> |
指定 ZK 集群位置
打开core-site.xml
增加配置:
1 | <property> |
分发配置文件
在/opt/hadoop/hadoop-2.6.5/etc/hadoop
目录下,仿照命令:
1 | scp core-site.xml hdfs-site.xml node01:`pwd` |
将配置文件分发到各个节点。
搭建 ZK 集群
以上我们只是完成了 hdfs 中与 ZK 有关的配置。ZK 本身的安装还没有完成。接下来进行 ZK 的安装。
在 node01 安装 ZooKeeper
首先使用 scp 命令将 ZK 发送到 node01 节点下。新建目录/opt/zookeeper/
。接着使用命令tar -zxvf zookeeper-3.4.6.tar.gz -C /opt/zookeeper
解包。
修改 ZK 配置文件
下面要对 ZK 进行一些配置。打开/opt/zookeeper/zookeeper-3.4.6/conf/
目录。该目录有名为zoo_sample.cfg
的配置文件模板。使用 cp 命令复制模板并且改名为zoo.cfg
。
修改 dataDir
找到 dataDir 参数,修改为/var/aliyun-study/zk
。
配置 ZK 节点
在配置文件末尾添加:
1 | server.1=node01:2888:3888 |
我们通过三行配置为 ZK 配置了三台节点,并指定了节点的物理地址和编号。2888 端口是 ZK 主从节点通讯端口。3888 是选举机制通讯接口。
向 node02 和 node03 分发 ZK
回到目录/opt
,仿照命令:
1 | scp -r zookeeper/ node02:`pwd` |
完成分发。
创建 myid 文件
在 node01 创建目录/var/aliyun-study/zk
。使用命令echo 1 > /var/aliyun-study/zk/myid
创建 myid 文件。使用类似的方法在 node02 和 node03 创建对应的 myid 文件(注意编号的对应)。
配置环境变量
来到 node01。使用vi + /etc/profile
添加环境变量。配置完成后将配置文件分发到 node02 和 node03。使用. /etc/profile
加载配置。
需要添加的环境变量是 ZOOKEEPER_HOME,仿照 JAVA_HOME 的添加方式即可
测试 ZK 集群
在 node01 到 node03 使用命令zkServer.sh start
启动集群。有两种方式确认是否启动成功。第一种是通过 jps 查看。如果看到了 QuorumPeerMain 进程说明启动成功。第二种是通过zkServer.sh status
命令查看。该命令会显示当前节点是 Leader 还是 Follower。
如果你只启动了一台机器,那么 zkServer.sh status 将会提示集群可能未运行。这是因为根据过半原则,只有超过两台服务器启动后集群才能正常运行。再启动一台机器就能正常显示节点的角色了
启动 hdfs 集群
我们已经完成了 ZooKeeper 的安装。下一步启动 hdfs 集群。这里需要注意集群启动的顺序。
启动 JN
JN 是 NN 数据同步的基础。在格式化并启动 hdfs 之前我们要首先启动 JN。分别在 node00、node01 和 node02 使用命令hadoop-daemon.sh start journalnode
启动 JN 进程。
启动 NN
接下来我们要选定一台 NN 启动。该节点将成为 Active NN。我选择了 node00。来到 node00,使用命令hdfs namenode -format
格式化 hdfs。这一步生成了 fsimage 和 edits文件。我们还需要使用命令hadoop-daemon start namenode
手动启动 NN 进程。
接着来到另一台 NN,这里是 node01,使用命令hdfs namenode -bootstrapStandby
将 node00 的数据同步到 node01,并让其处于 Standby 状态。
注册 Active NameNode
来到 node00 使用命令hdfs zkfc -formatZK
向 ZK 注册节点。此时来到 node01 发现可以使用命令zkCli.sh
进入 ZK 客户端进行管理。
启动 hdfs 集群
来到 node00 使用命令start-dfs.sh
启动集群。
关闭 hdfs 集群
来到 node00 使用命令stop-dfs.sh
关闭 hdfs 集群。来到 node01 使用zkServer.sh stop
命令关闭 ZK 集群。
以后再启动集群时,只需要先启动 ZK 然后使用命令
start-dfs.sh
即可