根据需求需要使用HBase做持久化存储,之前知道HBase属于深坑的组件,但基本的入门还是花了一周,先看了一天的存储结构,花了两天完成配置,代码调优,完成性能测试又用了两天。感觉可以挖好几个坑了,哈哈哈。


首先关于存储结构,我也是根据博客上手,自行设计的一个demo表结构,建表。做的迷迷糊糊,等有进一步的感悟后再讲讲吧(挖坑)。

大概讲下集群的Hbase配置和使用遇到的坑。这些坑与组件是互相关联的

1,pom文件

Hbase作为存储组件,首先和Hadoop以及zookeeper是紧密相关的,pom文件也需要添加以下的配置项

<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>2.7.3</version>
</dependency>
<dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>1.1.2</version>
</dependency>
dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-client</artifactId>
    <version>2.7.3</version>
</dependency>
<dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>1.1.2</version>
</dependency>

2.zookeeper节点冲突

另外,中途尝试使用本机搭建Hbase环境,但 Hbase的zookeeper配置和已经搭建Kafka的配置节点冲突,感觉应该可以通过修改zookeeper节点解决,但没找到修改地方,也没有实验。——>直接调集群配置去了。

3.系统设置,也是组件关联性的一部分

首先使用idea运行,连接集群,需要添加用户,输入密码。

System.setProperty("HADOOP_USER_NAME", "hdfs");

之后我遇到了这个错误

18/06/29 09:08:08 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
18/06/29 09:08:08 ERROR Shell: Failed to locate the winutils binary in the hadoop binary path
java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.

这和Hadoop的应用环境相关,我没有安装相应的环境,需要 winutils.exe和系统设置来解决

winutils.exe文件的话我找了个相近版本配置成功了。

同时要再主文件头添加System.setProperty("hadoop.home.dir", /文件路径/);

4,HBase配置

最重要的便是建立连接。

try {
    table = HBaseUtils.getConnection().getTable(TableName.valueOf(this.hBaseTable));
} catch (Exception e) {
    LOGGER.error("HBase连接建立出错",e);
    e.printStackTrace();
}
try {
    table = HBaseUtils.getConnection().getTable(TableName.valueOf(this.hBaseTable));
} catch (Exception e) {
    LOGGER.error("HBase连接建立出错",e);
    e.printStackTrace();
}

 

建立连接最重要的就是遍历文件。

if (null == CONN || CONN.isClosed()) {
    try {
        Configuration conf = HBaseConfiguration.create();
        CONN = ConnectionFactory.createConnection(conf);
    } catch (IOException e) {
        LOGGER.error("can not establish hbase connection.", e);
        throw new Exception("can not establish hbase connection.", e);
    }
}
return CONN;
if (null == CONN || CONN.isClosed()) {
    try {
        Configuration conf = HBaseConfiguration.create();
        CONN = ConnectionFactory.createConnection(conf);
    } catch (IOException e) {
        LOGGER.error("can not establish hbase connection.", e);
        throw new Exception("can not establish hbase connection.", e);
    }
}
return CONN;

就是这句 HBaseConfiguration.create();实现了遍历文件,底层实现看了一天没看懂。那么准备直接配,emm,就配了一天,所以来填坑了。

配置的文件名为hbase-site.xml,位置我放在了resources目录下,配置信息用的Ambrai平台上下载的配置。HBase组件下的下载配置栏下载hbase-sit.xml

.

hbase 客户端 ui hbase 客户端配置 避免卡住_hbase 客户端 ui

当时感觉终于好了,然后报错!!!最后检查原因居然是配置太多,某项出错(深坑)。最后经过测试得出只需要3个配置就能运行,其他的配置造成的影响暂不清楚。以下是最后的配置项:删了几十个,就剩3个。。。经过测试可以运行,使用时参照具体集群使用。

<configuration>

    <property>
        <name>hbase.zookeeper.property.clientPort</name>
        <value>2181</value>
    </property>

    <property>
        <name>hbase.zookeeper.quorum</name>
        <value>kafka003,kafka001,kafka002</value>
    </property>

    <property>
        <name>zookeeper.znode.parent</name>
        <value>/hbase-unsecure</value>
    </property>
  
</configuration>


    <property>
        <name>hbase.zookeeper.property.clientPort</name>
        <value>2181</value>
    </property>

    <property>
        <name>hbase.zookeeper.quorum</name>
        <value>kafka003,kafka001,kafka002</value>
    </property>

    <property>
        <name>zookeeper.znode.parent</name>
        <value>/hbase-unsecure</value>
    </property>
  
</configuration>

5.最后做了一下调优,提前建立连接,然后不断的遍历puts数据,这样节省了多次建立连接的时间消耗。

但不知道是否对数据的安全性是否有影响,该多久建立一次连接比较合适,以及单独建立一次连接的时间和资源消耗。