前言
最近在Hbase的使用过程中遇到了很多问题,通过各种查资料测试最终得到解决。趁此机会也对Hbase预分区及索引的原理作了一些较深入的学习,以便更好的使用Hbase及对数据库性能调优。
下面对Hbase的索引触发原理及Bulkload导入数据需注意的问题作了简要总结,希望能对大家起到一些帮助,共同学习进步。
1. Phoenix索引在Hbase中的存储形式
本文所说phoenix索引,默认都是指全局索引
使用phoenix为hbase中表example
创建二级索引INDEX_EXAMPLE
后,在Hbase或Phoenix中使用list
或!tables
命令查看当前表的时候,会发现多了数据库中多了一张原表对应的索引表。
phoenix索引表在Hbase中也是以表的形式存在,且该表的Row_key就是创建索引时的所有索引字段的拼接。当为多列建立索引时,rowkey实际上是这些column的组合,并且是按照它们的先后顺序的组合。
2. 多列索引的原理
在Phoenix中,我们可以为一张表的多个列(column)创建索引,但是在查询时必须要按照索引列的顺序来查询。例如,以下表为例:
# 创建表
CREATE TABLE example (
row_key varchar primary key,
col1 varchar,
col2 varchar,
col3 varchar,
col4 varchar,
col5 varchar
)
# 为col1,col2,col3三个列创建索引
create index idx_example on example (col1,col2,col3)
那么为了保证查询走索引,在查询的时候需要注意:
在查询时,可以同时将这3个索引列作为条件,且顺序不限。但是,第一列必须是col1
。
这是因为,如果查询时第一列不是col1
,那么就会进行全表扫描(full scan),速度会很慢。
而如果查询的第一列是col1
,就可以直接将满足关于col1
的数据记录找出来。即使后面还有没有被索引的列,也可以很快得到结果,因为满足关于M.C0的结果集已经不大了(如果是这种情况的话),对其再进行一次查询不会是full scan。
3. 使用Bulkload方式插入要注意的问题
Hbase和Phoenix都提供了Bulkload工具来支持快速大批量导入数据,但当在表上创建索引后,再使用Bulkload方式导入数据需注意数据插入后索引表是否同步更新。
3.1. 使用Hbase Bulkload方式(completeBulkload)
使用Hbase提供的bulkload方式批量导入数据时,不能同步更新索引表。
这是因为当以bulkload的方式来将数据导入到data table时,会绕开HBase的常规写入路径(client –> buffer –> memstore –> HLog –> StoreFile –> HFile),直接生成最终的HFiles。正常通过接口直接写数据进Phoenix表,相应的索引表也是会更新的,但是直接写数据到底层hbase表,这时候对应的索引表是不会更新,从而影响正常的用户访问。
优点:
支持java、Spark API,能够在java、spark程序中直接调用。
缺点:
不支持索引的同步更新
3.2 使用Phoenix Bulkload方式(csvBulkload)
使用Hbase提供的bulkload方式批量导入数据时,该表对应的索引表也会同步更新。
优点:
支持同步更新索引表。
缺点:
不支持java、Spark API,只能在命令行中使用,且需指定hadoop配置文件。
参考:
Phoenix 索引生命周期
利用Phoenix为HBase创建二级索引
解决Hbase数据更新Phoenix对应索引表不更新问题
来源:CSDN
作者:李京京
链接:https://blog.csdn.net/lijingjingchn/article/details/83186058