HBase的安装与部署

一、硬件环境

假设有4台机,IP及主机名如下:

192.168.100.105 c1
192.168.100.110 c2
192.168.100.115 c3
192.168.100.120 c4

二、软件环境

* 这里的ZooKeeper、Hadoop、HBase根目录都放在/home/目录下

1.安装JDK

https://www.cnblogs.com/live41/p/14235891.html

2.安装ZooKeeper

https://www.cnblogs.com/live41/p/15522363.html

* 虽然HBase内置了ZooKeeper,但一般是关闭内置版,使用独立部署版(因为还有其它进程需要用到ZooKeeper,以免维护2套)。

3.安装分布式Hadoop

https://www.cnblogs.com/live41/p/15483192.html

三、部署HBase

1.下载安装包

http://hbase.apache.org/downloads.html

下载bin文件,例如hbase-2.4.6-bin.tar

* 以下步骤在每台机都要执行

2.上传安装包到服务器并解压

假设安装在home目录

cd /home
rz

3.解压

tar -xvf hbase-2.4.6-bin.tar
mv hbase-2.4.6 hbase

4.配置环境变量

vim ~/.bashrc

在里面加入以下内容:

export PATH=$PATH:/usr/local/hbase/bin

保存退出后,更新环境变量:

source ~/.bashrc

三、配置HBase

* 先在c1机执行操作,再用scp把配置文件同步到其它机。

1.配置hbase-env.sh

vim /home/hbase/conf/hbase-env.sh

添加或反注释后添加以下内容:

export JAVA_HOME=/usr/bin/java1.8.0
export HBASE_CLASSPATH=/home/hbase/conf
export HBASE_MANAGES_ZK=false

2.配置hbase-site.xml

<configuration>
    <property>
        <name>hbase.rootdir</name>
        <value>hdfs://ns6/hbase</value>  <!--该属性对应的是hdfs-site.xml的dfs.nameservices属性-->
    </property>
    <property>
        <name>hbase.cluster.distributed</name>
        <value>true</value>
    </property>
    <property>
        <name>hbase.zookeeper.quorum</name>
        <value>c1:2181,c2:2181,c3:2181,c4:2181</value>
        <!--如果配置为<value>c1,c2,c3,c4</value>,则需要配置hbase.zookeeper.property.clientPort属性-->
    </property>
    <property>
        <name>hbase.master</name>
        <value>60000</value> <!--HBase HA 方式下只需配置端口-->
    </property>
    <!-- <property>
        <name>hbase.zookeeper.property.clientPort</name>
        <value>2181</value>
    </property> -->
</configuration>

 

3.配置regionservers

vim regionservers

添加以下内容,如果原来有localhost,先删除。

c1
c2
c3
c4

这里是对应hosts文件的配置,前面已经提及过。


4.复制Hadoop的关键配置文件到conf目录

* 执行这步需要先配置免密登录

cd /home/hadoop/etc/hadoop
cp core-site.xml hdfs-site.xml /home/hbase/conf

* 如果不执行这一步,启动HBase时会报错:

ERROR [main] regionserver.HRegionServer: Failed construction RegionServer
java.lang.IllegalArgumentException: java.net.UnknownHostException: ns6

原因是hbase-site.xml的hbase.rootdir属性使用了dfs.nameservices的值(也就是上面的ns6)。

如果不用dfs.nameservices的值,而是写死某个NameNode入口(例如c1:9000),则会有单点故障风险。

5.复制配置文件到其它节点

scp /home/hbase/conf/*.* c2:/home/hbase/conf
scp /home/hbase/conf/*.* c3:/home/hbase/conf
scp /home/hbase/conf/*.* c4:/home/hbase/conf

四、启动和停止HBase

1.在主节点机

* 这里是c1机

start-hbase.sh

2.在备用节点机(可选操作)

* 这里是c2机

需要手动启动,否则ZooKeeper只会启动1个。也可以选择不启动。

hbase-daemon.sh start master

3.停止

stop-hbase.sh

五、测试

1.命令行测试

登入HBase(跟MySQL类似)

hbase shell

hbase shell命令介绍:

https://blog.csdn.net/vbirdbest/article/details/88236575


2.浏览器测试

用浏览器打开:

http://192.168.100.105:16010/

HBase v1.0版本之前默认端口是60010,之后的版本是16010。

3.程序测试

使用Java编写程序调用HBase API来操作HBase。

(1) 先配置hosts的机器名和IP映射

需要先在运行Java程序的机器的hosts文件加入机器名和IP的映射。否则程序运行时会卡死或连接失败。

192.168.100.105 c1
192.168.100.110 c2
192.168.100.115 c3
192.168.100.120 c4

(2) 修改Maven配置文件(pom.xml)

在<dependencies></dependencies>节点内加入:

<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase-client</artifactId>
    <version>2.4.7</version>
</dependency>

* 其中三个version节点的2.4.7是对应HBase的版本。例如,安装的HBase是v2.4.0,那三个version节点就填2.4.0

(3) 实现代码

创建一张表,表名叫"User",添加2个列族分别叫"login"、"profile"。

public class HBaseCreateTable
{
    public static void main(String[] args)
    {
        String quorum = "c1,c2,c3,c4";
        String tableName = "Users";
        String[] familyNames = {"login", "profile"};
        try
        {
            createTable(quorum, tableName, familyNames);
        }
        catch (Exception e)
        {
            System.out.println(e);
        }
    }

    private static void createTable(String quorum, String tableName, String[] familyNames) throws Exception
    {
        Configuration conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum", quorum);

        Connection conn = ConnectionFactory.createConnection(conf);
        Admin admin = conn.getAdmin();
        TableName tb = TableName.valueOf(tableName);
        if (!admin.tableExists(tb))
        {
            TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tb);
            for (String name : familyNames)
            {
                ColumnFamilyDescriptor cfd = ColumnFamilyDescriptorBuilder.of(name);
                builder.setColumnFamily(cfd);
            }
            TableDescriptor desc = builder.build();
            admin.createTable(desc);
        }

        if (admin != null)
        {
            admin.close();
        }
        if (conn != null)
        {
            conn.close();
        }
    }
}

* 切记务必要执行第(1)点,否则程序运行会卡死。

参考文章:https://www.cnblogs.com/live41/p/15504691.html

附录:hbase-site.xml参数说明

  • hbase.rootdir

这个目录是 RegionServer 的共享目录,用来持久化 HBase。特别注意的是 hbase.rootdir 里面的 HDFS 地址是要跟 Hadoop 的 core-site.xml 里面的 fs.defaultFS 的 HDFS 的 IP 地址或者域名、端口必须一致。(HA环境下,dfs.nameservices  是由zookeeper来决定的)

  • hbase.cluster.distributed

HBase 的运行模式。为 false 表示单机模式,为 true 表示分布式模式。若为 false,HBase 和 ZooKeeper 会运行在同一个 JVM 中

  • hbase.master

如果只设置单个 Hmaster,那么 hbase.master 属性参数需要设置为 master:60000 (主机名:60000)

如果要设置多个 Hmaster,那么我们只需要提供端口 60000,因为选择真正的 master 的事情会有 zookeeper 去处理

  • hbase.tmp.dir

本地文件系统的临时文件夹。可以修改到一个更为持久的目录上。(/tmp会在重启时清除)

  • hbase.zookeeper.quorum

对于 ZooKeeper 的配置。至少要在 hbase.zookeeper.quorum 参数中列出全部的 ZooKeeper 的主机,用逗号隔开。该属性值的默认值为 localhost,这个值显然不能用于分布式应用中。

  • hbase.zookeeper.property.dataDir

这个参数用户设置 ZooKeeper 快照的存储位置,默认值为 /tmp,显然在重启的时候会清空。因为笔者的 ZooKeeper 是独立安装的,所以这里路径是指向了 $ZOOKEEPER_HOME/conf/zoo.cfg 中 dataDir 所设定的位置。

  • hbase.zookeeper.property.clientPort

客户端连接 ZooKeeper 的端口。默认是2181。

  • zookeeper.session.timeout

ZooKeeper 会话超时。Hbase 把这个值传递改 zk 集群,向它推荐一个会话的最大超时时间

  • hbase.regionserver.restart.on.zk.expire

当 regionserver 遇到 ZooKeeper session expired , regionserver 将选择 restart 而不是 abort。

原文地址:https://www.cnblogs.com/live41/p/15494279.html