你好,游客 登录
背景:
阅读新闻

HBase集群搭建笔记

[日期:2017-11-17] 来源:progape's site  作者: [字体: ]

最近突发奇想,想自己搭建一个 HBase 集群玩玩,一来复习一下 HBase 的架构,二来试试搭建一个分布式系统需要注意哪些问题,三来可以练练动手能力。但理想很丰满,现实很骨感,我在搭建的过程中碰到了非常多的问题,觉得有必要记录下来整个搭建过程,并试着在其中加入一些 HBase 集群的知识。

准备工作

因为手头只有一台机器,没有多余的机器,因此,这种条件下,玩集群最经济的方式就是用 VirtualBox 虚拟几台虚拟机和几个虚拟网络,在单机模拟集群。

这里我使用了 Vagrant 来简化虚拟机的创建过程,创建好一台虚拟机之后,通过打包成 Vagrant Box,可以很方便地创建一系列的虚拟机,这里不详细介绍 Vagrant,具体用法请在其 官网 学习。

以下列出了所需要的一些资源:

  • 3 台 VM,我使用的是 CentOS 7
  • VM 上安装好 JDK,配置好 $JAVA_HOME ,以及 wget 等常用工具
  • 一颗大心脏和一份耐心

其中,所有组件的版本如下:

ZooKeeper: 3.4.9
hadoop(HDFS): 2.7.3
HBase: 1.3.0

节点角色如下:

Host NameZooKeeperHDFSHBase
node1 Node1 NameNode, SecondaryNameNode Master
node2 Node2 DataNode RegionServer
node3 Node3 DataNode RegionServer

系统配置

这里需要把系统配置拿出来单独记录,因为这个地方是我碰到问题最多的点。

网络配置

我们有 3 台 VM,首先修改三台机器的 hostname 和 IP 地址(我这里使用了私有网络):

192.168.100.101    node1
192.168.100.102    node2
192.168.100.103    node3

hostname 记录在 /etc/hostname 文件中,hostname 和 IP 的映射关系记录在 /etc/hosts 文件中。需要注意的是,在 /etc/hosts 文件中, 一定不要把 hostname 映射到 127.0.0.1 上。

以上修改需要重启 VM。

SELinux 配置

因为后面 HDFS 和 HBase 的启动需要使用 SSH(具体原因见下),如果 SELinux 处于开启状态,那么即使把某个节点的公钥加入到 ~/.ssh/authorized_keys 文件中,SSH 免密登录也不会成功(因为懒,没有去找开启 SELinux 情况下如何 SSH 免密登录)。

为了简化集群搭建,我这里将这个内核模块关闭,具体关闭方法为修改 /etc/selinux/config文件,将其中的 SELINUX=enforcing 修改为 SELINUX=disabled 

以上修改需要重启 VM。

生成公钥

$ ssh-keygen -t rsa

这里我们将 node1 作为 HDFS 的 NameNode 和 HBase 的 Master 节点,因此,需要将 ~/.ssh/id_rsa.pub 公钥加入到其他节点的 ~/.ssh/authorized_keys 文件中。

ZooKeeper 集群

ZooKeeper 用于 HBase 集群节点的注册和路由,HBase 内部集成了一个 Embeded ZooKeeper,但这里我选择单独搭建 ZooKeeper,因为能提供更多的灵活性,并且将来可以单独作为服务部署,用于其他目的。

修改配置

首先需要修改 ${ZK_HOME}/conf/zoo.cfg 文件,该文件可以从 ${ZK_HOME}/conf/zoo_sample.cfg 文件拷贝过来。将其中的 dataDir 从 tmp 目录修改为一个有效的可以提供永久存储的目录,例如 /home/vagrant/data/zookeeper ,然后再该文件最后增加集群其他节点的 hostname 和通信端口,以下为我的配置文件内容:

# ${ZK_HOME}/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/vagrant/data/zookeeper
clientPort=2181
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888

其中, dataDir 指定了 ZooKeeper 需要将数据存储在何处;2181 为接收客户端连接的监听端口,2888 为 Leader 和 Follower 的通信端口,3888 为 Leader 选举通信端口。

另外,需要在 dataDir 目录中增加 myid 文件,对应 zoo.cfg 文件中 server.n 中的 n值,例如:node1 的 /home/vagrant/data/zookeeper/myid 文件内容为 1。

启动集群

在每个节点下分别执行:

$ cd ${ZK_HOME}
$ sudo bin/zkServer.sh start

查看一下日志,确认 Leader 是否已经选举出来。

HDFS 集群

HDFS 是 Hadoop 的一个组件,并没有单独提供出来,因此,必须下载整个 Hadoop 项目。

修改配置

需要修改的配置文件有 ${HADOOP_HOME}/etc/hadoop/hadoop-env.sh  ${HADOOP_HOME}/etc/hadoop/slaves ,前者用于配置启动 Hadoop 之后的环境变量,这个文件只需要修改 JAVA_HOME 环境变量的值即可;后者用于告诉后面启动集群脚本 DataNode 的机器名,将其改成

# ${HADOOP_HOME}/etc/hadoop/slaves
node2
node3

另外,还需要修改 ${HADOOP_HOME}/etc/hadoop/core-site.xml  ${HADOOP_HOME}/etc/hadoop/hdfs-site.xml 这两个配置文件,分别配置如下:

<!-- ${HADOOP_HOME}/etc/hadoop/core-site.xml -->
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://node1:8020</value>
    </property>
</configuration>

<!-- ${HADOOP_HOME}/etc/hadoop/hdfs-site.xml -->
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/home/vagrant/data/hdfs</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/home/vagrant/data/hdfs</value>
    </property>
</configuration>

其中, fs.defaultFS 属性规定了 NameNode 的 URI,DataNode 使用该属性与 NameNode 进行 RPC 通信,客户端通过该 URI 与整个集群进行通信。 dfs.namenode.name.dir  dfs.datanode.data.dir 分别规定了 NameNode 和 DataNode 数据存储的根目录。

注意,我们这里 HDFS 并没有单独配置 SecondaryNameNode 节点,默认情况下,HDFS 会将 SecondaryNameNode 和 NameNode 建立在同一台机器上。

启动集群

在启动 HDFS 之前,需要先在 NameNode 上将 HDFS 格式化,命令如下:

$ cd ${HADOOP_HOME}/bin/hdfs namenode -format <cluster_name>

Hadoop 提供了在 NameNode 上远程启动 DataNode 上 HDFS 进程的功能,该功能通过 SSH 实现,这也就是为什么之前要配置 SSH 免密码登录。

使用如下命令启动 HDFS 集群:

$ cd ${HADOOP_HOME}
$ sbin/start-dfs.sh

如果一切顺利,通过访问 http://node1:50070 即可访问 HDFS 的 Web 控制台,查看集群的状态。

HBase 集群

上述两个集群运行起来之后,才可以启动 HBase 集群。HBase 的配置方法相对上述两个集群来说更加麻烦一点。

修改配置

和 HDFS 一样,HBase 提供了一个 ${HBASE_HOME}/conf/hbase-env.sh 的脚本文件,用于初始化环境变量,这里需要修改 JAVA_HOME  HBASE_MANAGES_ZK 两个变量:

# ${HBASE_HOME}/conf/hbase-env.sh
export JAVA_HOME=/usr
export HBASE_MANAGES_ZK=false

接下来需要配置 ${HBASE_HOME}/conf/hbase-site.xml 文件:

<!-- ${HBASE_HOME}/conf/hbase-site.xml -->
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <property>
        <name>hbase.rootdir</name>
        <value>hdfs://node1:8020/hbase</value>
    </property>
    <property>
        <name>hbase.cluster.distributed</name>
        <value>true</value>
    </property>
    <property>
        <name>hbase.zookeeper.quorum</name>
        <value>node1,node2,node3</value>
    </property>
</configuration>

其中, hbase.rootdir 属性定义了 HDFS 的地址,一开始的时候我使用了本地路径 file:///home/vagrant/data/hbase ,结果 RegionServer

接着,将 ${HBASE_HOME}/conf/regionservers 的内容修改为:

# ${HBASE_HOME}/conf/regionservers
node2
node3

启动集群

和 Hadoop 一样,HBase 可以由 Master 节点通过 SSH 来启动整个集群里的 HBase 进程:

$ cd ${HBASE_HOME}
$ bin/start-hbase.sh

如果一切顺利,通过访问 http://node1:16010 即可访问 HBase 的 Web 控制台,查看 HBase 集群的状态。

总结

其实最开始的时候准备用 Docker 来搭建整个集群,但因为对 Docker 网络配置部分的不熟悉,出了相当多的问题,基本都是 Slave 节点无法连接到 Master 节点的问题,因此尝试了一段时间之后放弃了,转而使用了更加重量级的 VM 来搭建。

使用 VM 来搭建也碰到了很多问题,如下:

  • VM 之间无法连接,一般是 hostname 配置错误导致
  • HBase 节点绑定 IP 错误,因为 Vagrant 默认会创建 NAT 适配器,而我们需要使用 Bridged 网络配置固定 IP,因此,需要将当前节点的 hostname 和 IP 的映射关系也写入 /etc/hosts 文件中
  • 按照 HBase 官方的文档配置,将 hbase.rootdir 配置成了本地路径,结果导致 Master 节点无法启动,这个我 Google 了一下也没查清楚原因,但配置好了 HDFS 之后问题得到解决,不清楚问题是什么原因

这个集群的配置使用了最简单的配置方案,并没有对默认配置做过多的修改,在此基础上可以做一些修改,例如 HBase 和 HDFS 都可以配置上 master-backup 和 SecondaryNameNode 以实现 HA 等。





收藏 推荐 打印 | 录入:Cstor | 阅读:
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款