根据需求需要使用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
.
当时感觉终于好了,然后报错!!!最后检查原因居然是配置太多,某项出错(深坑)。最后经过测试得出只需要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数据,这样节省了多次建立连接的时间消耗。
但不知道是否对数据的安全性是否有影响,该多久建立一次连接比较合适,以及单独建立一次连接的时间和资源消耗。