Phoenix二级索引原理及Bulkload注意问题

佐手、 提交于 2019-12-15 01:11:48

前言

最近在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对应索引表不更新问题

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!