Hadoop2.x HA模式搭建

NameNode HA 初探

HA 模式相关概念

Hadoop 2.x 版本之后增加了一种高可用模式。
在 Hadoop 1.x 版本中,hadoop的集群主要由一个 NameNode、一个 SecorndaryNameNode 以及一或多个DataNode组成,这种模式就造成了一旦 NameNode 节点不可用,整个集群也将变成不可用状态。
在 Hadoop 2.x 中,NameNode HA 解决了这一问题。在 HA 模式下,Hadoop 集群同时启动两个 NameNode 节点,一个为 active 状态,另一个为 standby 状态。处于 active 状态的节点正常提供 NameNode 服务;处于 standby 状态的节点不提供 NameNode 服务,只进行数据同步,时刻准备提供服务。

NameNode 数据的同步

在 HA 模式下,处于 active 状态的 NameNode 和处于 standby 状态的 NameNode 会进行数据的共享,以在 active 节点宕机时 standby 能够迅速成为 active 接替进行服务。
数据的同步方式有以下两种:

  • 通过 Network File System 实现:通过 Linux 共享的文件系统实现数据同步,属于操作系统配置;
  • 通过 Quorum Journal Node 实现:通过 JournalNode 节点进行文件共享,属于 Hadoop 自身的实现。
    在 Quorum Journal Node 模式中,处于 active 状态的 NameNode 在其有修改时,会向 JournalNode 中写文件,处于 standby 状态的 NameNode 会从 JournalNode 中读取变更,并把这些变化应用于自身。

写在搭建之前

搭建基础环境

本示例最终将搭起一个5个节点(2 NameNode、3 DataNode)的集群。其中在文中主机名和其上配置如下:

  • master1: NameNode(初始active)
  • master2: NameNode(初始standby)
  • slave1: DataNode、JournalNode、Zookeeper
  • slave2: DataNode、JournalNode、Zookeeper
  • slave3: DataNode、JournalNode、Zookeeper

示例共涉及五个主机,我们按照功能大致命名如上文。其中,master1 和 master2 中主要是部署 NameNode 服务,slave1、slave2、slave3 中主要部署 JournalNode、DataNode 以及 zkfc 服务所需要的 zookeeper 集群。

环境准备

我们的主机全部基于 Centos 系统,在进行集群安装之前应确保主机中已经解压有 jdk, 同时确保slave的三台机器内已经解压有zookeeper并已经配置好zoo.cfg。并已经通过一种途径获得 hadoop 2.6 的压缩包。
本实例中选择 /export/server/ 为部署根目录,用户可以自行定义根目录。
注:本实例仅搭建 NameNode HA 模式下的 hdfs,不进行 YARN 等的配置。

环境搭建

解压 hadoop 安装包

1
tar -zxvf hadoop-2.6.0.tar.gz

指定环境变量

1
2
cd hadoop-2.6.0/etc/hadoop
vi hadoop-env.sh

将 JAVA_HOME 修改为你的jdk目录

配置 hdfs-site.xml

1
vi hdfs-site.xml

NameNode HA 模式下,hdfs-site.xml 文件的配置和单 NameNode 集群的配置不同。主要区别如下:

  • 配置命名空间的名称 nameservices

    1
    2
    3
    4
    5
    <!-- value可以自行修改,但是要和后面对应 -->
    <property>
    <name>dfs.nameservices</name>
    <value>jayden</value>
    </property>
  • 配置命名空间中每个 namenode 的唯一标识,下例中代表在该命名空间内有两个命名为 nn1、nn2 的 namenode

    1
    2
    3
    4
    5
    <!-- 此处namenodes 后面的应跟定义的命名空间保持一致 -->
    <property>
    <name>dfs.ha.namenodes.jayden</name>
    <value>nn1,nn2</value>
    </property>
  • 为每个 namenode 配置 rpc-address

    1
    2
    3
    4
    5
    6
    7
    8
    <property>
    <name>dfs.namenode.rpc-address.jayden.nn1</name>
    <value>master1:8020</value>
    </property>
    <property>
    <name>dfs.namenode.rpc-address.jayden.nn2</name>
    <value>master2:8020</value>
    </property>
  • 为每个 namenode 配置 http-address

    1
    2
    3
    4
    5
    6
    7
    8
    <property>
    <name>dfs.namenode.http-address.jayden.nn1</name>
    <value>master1:50070</value>
    </property>
    <property>
    <name>dfs.namenode.http-address.jayden.nn2</name>
    <value>master2:50070</value>
    </property>
  • 配置 NameNode 读写 JNs 组的 uri

    1
    2
    3
    4
    <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://slave1:8485;slave2:8485;slave3:8485/jayden</value>
    </property>
  • 配置 HDFS Clients 连接到活动 NameNode 的 Java 方法

    1
    2
    3
    4
    <property>
    <name>dfs.client.failover.proxy.provider.jayden</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
  • 配置 ssh fench

    1
    2
    3
    4
    <property>
    <name>dfs.ha.fencing.methods</name>
    <value>shell(/var/lib/hadoop-hdfs/fencingscript.sh)</value>
    </property>
  • 配置在active挂掉时自动切换

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

除却这些 HA 配置外,也需要配置一些 hdfs 基本配置,示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<property>
<name>dfs.namenode.name.dir</name>
<value>/export/hadoop/data/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/export/hadoop/data/datanode</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>

截止到此,hdfs-site.xml 配置完毕。

配置 core-site.xml

1
vi core-site.xml

NameNode HA 模式下的 core-site.xml主要配置三个配置项,具体如下:

  • 配置命名空间

    1
    2
    3
    4
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://jayden</value>
    </property>
  • 配置临时数据存储路径

    1
    2
    3
    4
    <property>
    <name>hadoop.tmp.dir</name>
    <value>/export/hadoop/temp</value>
    </property>
  • 配置 zookeeper

    1
    2
    3
    4
    <property>
    <name>ha.zookeeper.quorum</name>
    <value>slave1:2181,slave2:2181,slave3:2181</value>
    </property>
  • 配置时间间隔

    1
    2
    3
    4
    <property>
    <name>fs.trash.interval</name>
    <value>1440</value>
    </property>

至此,core-site.xml 配置完毕。

配置slave

1
vi slaves

配置 slaves 时,仅需将三个 slave 节点的 Host(IP) 写入文件即可:

1
2
3
slave1
slave2
slave3

下发配置到所有机器

集群五个节点的 hadoop 及配置均相同,在一个机器上编辑过配置后,可通过 scp 等方式直接传递到其他节点。

启动测试

环境依赖及启动顺序简介

在 NameNode HA 环境中,NameNode 节点由 zkfc(ZkFailOverController)进行协调,在首先启动的时候,我们需要将两个 NameNode 进行一个默认配置,即指定 master2 为 standby,让 master1 成为 active。
在此基础上,zkfc依赖zk,同时两个 NameNode 节点通信还需要 JournalNode。故大致整理启动顺序如下:
启动zk -> 启动JournalNode -> 启动 NameNode -> 启动 zkfc -> 启动 DataNode

具体启动操作

  • 进入 slave1 zookeeper 安装目录下的 bin 目录,执行

    1
    ./zkClient.sh start
  • 进入 slave1 hadoop 安装目录下的 sbin 目录,执行

    1
    ./hadoop-daemon.sh start journalnode

完成后,对 slave2 slave3 重复上面操作

  • 进入 master1 hadoop 安装目录下的 bin 目录,执行
    1
    ./hdfs namenode -format

执行完该步骤后,在配置文件里配置的 namenode 目录下会生成一些文件,将这些文件通过 scp 等方式拷贝到 master2 的相同目录

  • 进入 master1 hadoop 安装目录下的 sbin 目录,执行
    1
    ./hadoop-daemon.sh start namenode

通过 jps 查看,能查看到 namenode,该步骤成功

  • 进入 master2 hadoop 目录下的 bin 目录,执行

    1
    ./hdfs namenode -bootstrapStandby
  • 进入 master2 hadoop 目录下的 sbin 目录,执行

    1
    ./hadoop-daemon.sh start namenode

通过 jps 查看,能查看到 namenode,该步骤成功

  • 进入 master1 hadoop 目录下的 bin 目录,执行

    1
    ./hdfs zkfc -formatZk
  • 进入 master1 hadoop 目录下的 sbin 目录,执行

    1
    ./hadoop-daemon.sh start zkfc
  • 进入 slave1 hadoop 目录下的 sbin 目录,执行

    1
    ./hadoop-daemon.sh start datanode

在 slave2 slave3 上重复该操作

截止到此,NameNode DataNode 均已启动成功,可以通过Web UI 或者 hdfs 命令进行测试。

一些方便的配置

  • 可以在配置集群之前先对集群节点机器进行免密登录配置,随后可通过 start-dfs.sh 脚本一次性启动,减少操作;
  • 可以在hadoop解压过后配置环境变量,免去每次使用 hdfs 命令都要切换目录的麻烦。

本文只是一个简单的安装调试记录,如有问题,欢迎 email 至 JaydenRansom@outlook.com