简单的HBase Client端实现
来源:程序员人生 发布时间:2015-01-08 14:01:45 阅读次数:2394次
前言
newbie刚接触HBase,遇到几个初学者常见的关于HBase问题,这里就问题就不多做介绍,主要还是编码优化问题,下面专门介绍以下几点,希望对初学者有所帮助。
基于HBase-0.94.x 版本
Tips
RowKey的设计
HBase的不管甚么操作都是对rowkey进行扫描操作的,rowkey的排序是依照字典序来排的。
IO斟酌
为读优化
设计行健时,尽可能把行健依照序号紧挨1起,减少扫描。
为写优化
主要是斟酌所有的rowkey不要写到同1个region上,这样会致使其他机器很空闲,只有这个region的吞吐量就是你利用的吞吐量
例如时间戳做行健就会出现这个问题。
解决方法主要是两个:
- 散列,建表时分表,然后写入时使用散列函数,将行健打散散布,这样做只是为了写操作多的优化,对读来讲,多是灾害(全表扫描)
- salting,使用随机值做前缀,解决散列全表扫描的问题
Merge相同的rowKey
由于HBase对每个命令(put,delete,get,increment)都是起1个线程来做的,每一个命令基本都有
addFamily(), addCloumns()方法可使用
这里漏掉1点是为何要merge:由于HBase对每个命令都是起1个thread来履行(0.94),所以为了减少thread的创建,所以尽可能merge
这里有人会问,merge以后的履行性能和merge之前的性能如何,会快还是慢??其实性能相差无几,具体可以去淘宝量子恒道blog(貌似打不开)上去看看测试结果
是不是需要自己做HTable Connection缓存管理
这1点是不需要的,HBase本身有Cache机制的,主要在HConnectionManager里面做管理,它会做缓存。每次close时也会检查该cacheINstance是不是还有reference,如果有就暂时不close,没有就close,reference⑴。详细请看HConnectionManager源码;
public static HConnection getConnection(final Configuration conf)
throws IOException {
HConnectionKey connectionKey = new HConnectionKey(conf);
synchronized (CONNECTION_INSTANCES) {
HConnectionImplementation connection = CONNECTION_INSTANCES.get(connectionKey);
if (connection == null) {
connection = (HConnectionImplementation)createConnection(conf, true);
CONNECTION_INSTANCES.put(connectionKey, connection);
} else if (connection.isClosed()) {
HConnectionManager.deleteConnection(connectionKey, true);
connection = (HConnectionImplementation)createConnection(conf, true);
CONNECTION_INSTANCES.put(connectionKey, connection);
}
connection.incCount();
return connection;
}
}
Code
我自己实现了1个简单的Hbase Client,不是线程安全,在github上,可以clone下参考,仅供参考(为经测试,可能存在毛病)
simple-hbase-client: git clone https://github.com/zhgwen/simple-hbase-client.git
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠