HBase Coprocessor实现HBase二级索引

用Coprocessor实现HBase的二级索引,遇到了很多问题,记录一下

首先本次的感想是:

官方文档很重要!

日志非常重要!!!

用的数据是POES粒子通量数据,选取其中的位置信息,mag_lat_sat, mag_lon_sat,时间信息time,L值IGRF_L和B值Btot,以及各能段0度和90度方向质子和电子的粒子通量数据存储,row key是通过L、lat、lon计算出来的索引值,用B值作一个二级索引,方便在LB坐标系下的索引。

首先,按照http://www.cnblogs.com/ventlam/archive/2012/10/30/2747024.html,数数据行数测试一下

表POESDataTest加载了自带的数行数的coprocessor

HBase Coprocessor实现HBase二级索引

HBase Coprocessor实现HBase二级索引

然后测试二级索引,按照https://www.jianshu.com/p/d56584c45401,稍作修改,写一个用Btot作二级索引的project,并且打包成jar包

HBase Coprocessor实现HBase二级索引

  • 将表disable,

disable 'POESDataTest2'

  • 加载coprocessor,

alter 'POESDataTest2', METHOD=>'table_att', 'coprocessor'=>'hdfs://[email protected]:9000/user/had_user/tests/TestCoprocessor.jar|coprocessor.TestCoprocessorIndex|'

  • 再enable表

enable 'POESDataTest2'

HBase Coprocessor实现HBase二级索引

为了防止加载coprocessor的时候错误导致集群挂掉,修改hbase-site.xml文件,加入一个property,hbase.coprocessor.abortonerror,设置成false

注意!这个参数在加载好了没问题之后需要重新设置回true,并且要把修改的hbase-site.xml重新放到project,重新生成和上传jar包。

一开始遇到了问题,加载coprocessor的时候,告诉我File dose not exist,jar包不存在,hbase shell告诉我把hbase-site.xml的hbase.table.sanity.checks这个property设置成false。这次没报错了,成功加载,成功enable,但是在scan 'POESDataTest2'的时候出现了问题

HBase Coprocessor实现HBase二级索引

网上搜了各种方案,hbase hbck显示POESDataTest2这个表有2个inconsistence,但是hbase hbck -repair, hbase hbck -repairHole都没有用。

重新去看日志

HBase Coprocessor实现HBase二级索引

you know what???他始终找不到jar文件,为什么在加载的时候没有报错呢,应为我把hbase.table.sanity.checks这个property设置成false了,不报错不代表没错,OK?

感觉被hbase shell的提示坑了一把。

加载成功后,往表里put一个数据测试

HBase Coprocessor实现HBase二级索引

发现索引表IndexTabelTest中没有数据,https://www.jianshu.com/p/d56584c45401文里说得很清楚,因为

hbase.coprocessor.abortonerror:如果coprocessor加载失败或者初始化失败或者抛出Throwable对象,则主机退出。设置为false会让系统继续运行,但是coprocessor的状态会不一致,所以一般debug时才会设置为false,默认是true;.说的很清楚了,虽然我之后上传了很多个版本的coprocessor,但是在集群重启之前它一直沿用着最早那个版本。将参数再调整为true,重新上传jar包

重新上传jar,重启集群。然后成功

HBase Coprocessor实现HBase二级索引