简单的HBase Client端实现

前言

newbie刚接触HBase,遇到几个初学者常见的关于HBase问题,这里就问题就不多做介绍,主要还是编码优化问题,下面专门介绍以下几点,希望对于初学者有所帮助。
基于HBase-0.94.x 版本

Tips

RowKey的设计

HBase的无论什么操作都是对rowkey进行扫描操作的,rowkey的排序是按照字典序来排的。

IO考虑

为读优化
设计行健时,尽量把行健按照序号紧挨一起,减少扫描。
为写优化
主要是考虑所有的rowkey不要写到同一个region上,这样会导致其他机器很空闲,只有这个region的吞吐量就是你应用的吞吐量
例如时间戳做行健就会出现这个问题。
解决方法主要是两个:
  1. 散列,建表时分表,然后写入时使用散列函数,将行健打散分布,这样做只是为了写操作多的优化,对于读来说,可能是灾难(全表扫描)
  2. salting,使用随机值做前缀,解决散列全表扫描的问题


Merge相同的rowKey

因为HBase对于每一个命令(put,delete,get,increment)都是起一个线程来做的,每个命令基本都有
addFamily(), addCloumns()方法可以使用
这里漏掉一点是为什么要merge:因为HBase对于每一个命令都是起一个thread来执行(0.94),所以为了减少thread的创建,所以尽量merge
这里有人会问,merge之后的执行性能和merge之前的性能如何,会快还是慢??其实性能相差无几,具体可以去淘宝量子恒道blog(貌似打不开)上去看看测试结果


是否需要自己做HTable Connection缓存管理

这一点是不需要的,HBase本身有Cache机制的,主要在HConnectionManager里面做管理,它会做缓存。每次close时也会检查该cacheINstance是否还有reference,如果有就暂时不close,没有就close,reference-1。详细请看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;
    }
  }
可以看下这篇文章: 

Hbase客户端连接管理


Code

我自己实现了一个简单的Hbase Client,不是线程安全,在github上,可以clone下参考,仅供参考(为经测试,可能存在错误)

simple-hbase-client: git clone https://github.com/zhgwen/simple-hbase-client.git
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值