HBase项目设计思路

HBase在项目中的使用

对于HBase的Split

在项目中Split的过程如下:

  1. 智能分块,项目中初始Region块为10,但是可以根据自己的需求进行设置。
  2. 为了在split时相同前缀的RowKey能split到同一Region,并且便于建立索引,在原始表中会存储前缀,即在有数据部分冗余的情况下保证split时数据的完整,前缀为split后Region的的初始行键。
  3. 手动根据Region块号进行split
  4. split完成后再进行索引

对于HBase的Scan

在项目中使用scan的技巧

  1. 若为在MR的情况下,可以设置scan.setCacheBlocks(false),加速查询,但不为MR的情况,需要缓存,保存默认配置
  2. scan.setCaching(200);//每次从服务器端读取的行数,大了占内存,但是rpc少
  3. scan.setBatch(6);//设置获取记录的列的个数,默认无限制,即返回所有列

对于HBase如何判断Split完成

项目中目前没有特别好的方法,正常应该查看Meta表是否有增加region。项目中的大致思路也是这样,由于客户端Split是一个异步操作,所以while循环判断region的个数是否有变化,当有变化时跳出循环,注意,原region split后region的timestamp会发生变化但是其余不变,可以根据原起始行键找到该region,对于原region,删除索引后再新建索引,对于新的region直接新建索引即可

由于split是一个漫长的过程,所以需要单独开辟一个线程来做, 注意要添加while(!pool.isTerminated()){},防止主线程的执行时间小于子线程的执行时间

HBase权限设置

由于并不是所有人都可以Split,因此很自然的想到给不同的用户加上权限。HBase的权限初始设置在hbase.site.xml中。

然后在shell中使用grant命令进行权限分配。分配完权限后,以后再进入shell前,需要sudo -u 用户名 hbase shell

收回权限使用revoke,与关系型数据库类似。

获取数据

在本项目中,若要后期优化的话主要是从搜索角度上来进行优化。首先本项目有一个优点是使用协处理器进行搜索。但只是从协处理器搜索出了相应的行键,然后再使用批量get的方法获取了所需要的result。实际上这块可以全部在协处理器上完成,即在协处理上搜索出来行键后由于行键和索引是在同一region块中,所以可以很快定位到该记录。使用这种方法可以减少一次RPC操作。

但是该方法也有难点,即由于需要事先知道协处理器的返回对象类型,由于类型为Result,且Result变量较多,较难进行处理。另外一点,若使用这种方法,一下业务逻辑也将会放在协处理器类中,可能会增加服务器的开销。

实际上对比一下,由于hbase批量get的速度会很快,两种方案的时间在数据量返回一般时不会相差太多,即10毫秒左右

插入数据

在为了配合split的情况下,数据在HBase中会有部分冗余,即以

0000

0001:xxxx

……

这种方式进行,0000是该region块中每一个记录的起始前缀,在split时,可以根据起始前缀进行split。目的:为了使索引和数据保持在同一region块中,且索引在数据的上方。防止split时,只split了同一数据的部分前缀,导致数据隔离

未来优化

  1. 加入snappy压缩数据,由于实验室环境有问题,目前安装snappy一直没有成功
Share