0%

基于阿里云 ECS 搭建大数据集群(三)

学习基于阿里云 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
2
3
4
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>

其中 NameService 的名称mycluster可以随意指定。这里使用的是官网文档中的命名。如果需要配置联邦,这一项中可以同时配置多个 NameService 逻辑名称(使用逗号隔开)。

配置 mycluster 下 NameNode 逻辑名称

在配置中添加:

1
2
3
4
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>

这一步为 mycluster 添加了两个逻辑节点 nn1 和 nn2。我们将在稍后为这两个逻辑节点指定具体的物理节点。

Hadoop 2.x 版本中,一个 NameService 只支持两个 NameNode

指定 NameNodes

在配置中添加:

1
2
3
4
5
6
7
8
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node00:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node01:8020</value>
</property>

rpc 是远程服务调用(remote procedure call)的缩写

配置 http 端口

在配置中添加:

1
2
3
4
5
6
7
8
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node00:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node01:50070</value>
</property>

这一步的配置是为了能够通过浏览器可视化监控集群运作情况

配置 JN 主机位置

集群工作时,Active NameNode 将会向 JN 中写入 edits 数据,而 Standby 将会读取。这一步我们要指定 JN 主机位置。

在配置中添加:

1
2
3
4
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node00:8485;node01:8485;node02:8485/mycluster</value>
</property>

配置代理类

直接照抄官方文档:

1
2
3
4
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

配置 Fencing Method

故障发生时 ANN 可能仍然在从 Client 读取数据并写入 edits,从而导致脑裂(split brain)。因此需要配置一种故障隔离方法。

在配置中添加:

1
2
3
4
5
6
7
8
9
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>

<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/hadoop.pem</value>
</property>

配置 JN 日志文件保存位置

在配置中添加:

1
2
3
4
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/aliyun-study/hadoop/ha/journalnode</value>
</property>

配置 core-site.dfs

打开/opt/hadoop/hadoop-2.6.5/etc/hadoop目录下的core-site.xml文件。

配置 fs.defaultFS

我们的主节点不再是 node00 单节点,而是名为 mycluster 的逻辑节点。修改配置如下:

1
2
3
4
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>

修改 hadoop.tmp.dir

将 full 修改为 ha。


基于 ZooKeeper 的自动故障转移

经过上一段的配置,集群已经可以通过手动方式进行故障转移了。具体操作的方法可以在官方文档找到。接下来我们要配置基于 ZooKeeper 的自动故障转移。

注意此时我们还没有进行 ZooKeeper 的安装,只是先行在 HDFS 中完成配置

配置 HDFS

打开自动故障转移功能

hdfs-site.xml中增加配置:

1
2
3
4
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>

指定 ZK 集群位置

打开core-site.xml增加配置:

1
2
3
4
<property>
<name>ha.zookeeper.quorum</name>
<value>node1:2181,node2:2181,node3:2181</value>
</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
2
3
server.1=node01:2888:3888
server.2=node02:2888:3888
server.3=node03: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即可