1. 说明
在HBase中,只有一个单一的按照字典序排序的rowKey索引,当使用rowKey来进行数据查询的时候速度较快,但是如果不使用rowKey来查询的话就会使用filter来对全表进行扫描,很大程度上降低了检索性能。而Phoenix提供了二级索引技术来应对这种使用rowKey之外的条件进行检索的场景。
Phoenix支持两种类型的索引技术:Global Indexing和Local Indexing,这两种索引技术分别适用于不同的业务场景(主要是偏重于读还是偏重于写)。下面分别对这两种索引技术简单使用一下,具体性能方面没有进行测试。
以上文字摘自官方文档
本篇主要介绍Local Indexing相关技术。
2. Local Indexing
Local indexing targets write heavy, space constrained use cases. Just like with global indexes, Phoenix will automatically select whether or not to use a local index at query-time. With local indexes, index data and table data co-reside on same server preventing any network overhead during writes. Local indexes can be used even when the query isn’t fully covered (i.e. Phoenix automatically retrieve the columns not in the index through point gets against the data table). Unlike global indexes, all local indexes of a table are stored in a single, separate shared table.At read time when the local index is used, every region must be examined for the data as the exact region location of index data cannot be predetermined.Thus some overhead occurs at read-time.
Local indexing适用于写操作频繁的场景。与Global indexing一样,Phoenix会自动判定在进行查询的时候是否使用索引。使用Local indexing时,索引数据和数据表的数据是存放在相同的服务器中的避免了在写操作的时候往不同服务器的索引表中写索引带来的额外开销。使用Local indexing的时候即使查询的字段不是索引字段索引表也会被使用,这会带来查询速度的提升,这点跟Global indexing不同。一个数据表的所有索引数据都存储在一个单一的独立的可共享的表中。在读取数据的时候,标红的那句话不会翻译大意就是在读数据的时候因为存储数据的region的位置无法预测导致性能有一定损耗。
2.1 配置hbase-site.xml
使用Local Indexing的话需要配置hbase-site.xml,在HBase集群的master节点的hbase-site.xml中添加如下配置并重启HBase集群。
Local indexing also requires special configurations in the master to ensure data table and local index regions co-location.
配置这个参数的目的是确保数据表与索引表协同定位。
<property>
<name>hbase.master.loadbalancer.class</name>
<value>org.apache.phoenix.hbase.index.balancer.IndexLoadBalancer</value>
</property>
<property>
<name>hbase.coprocessor.master.classes</name>
<value>org.apache.phoenix.hbase.index.master.IndexMasterObserver</value>
</property>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
高能预警:如果使用的是Phoenix 4.3+的版本的话还需要在HBase集群的每个regionserver节点的hbase-site.xml中添加如下配置并重启HBase集群。
To support local index regions merge on data regions merge you will need to add the following parameter to hbase-site.xml in all the region servers and restart. (It’s applicable for Phoenix 4.3+ versions)
这个配置是为了支持在数据region合并之上进行索引region合并(这句话感觉翻译的不太准确)。
<property>
<name>hbase.coprocessor.regionserver.classes</name>
<value>org.apache.hadoop.hbase.regionserver.LocalIndexMerger</value>
</property>
- 1
- 2
- 3
- 4
2.2 创建表
进入phoenix的CLI的界面创建company表。
> create table company(id varchar primary key, name varchar, address varchar);
- 1
查看company表索引
> !indexes company
- 1
2.3 创建索引
对company表的name字段创建索引,索引名为my_index。
> create local index my_index on company(name);
- 1
查看当前所有表会发现多一张MY_INDEX索引表,查询该表数据。
通过squirrel来查看company的索引字段。
从HBase的CLI界面查看当前所有表。
> list
- 1
高能预警:这里的索引表并不叫MY_INDEX,而是叫_LOCAL_IDX_COMPANY,但是在Phoenix的CLI中进行数据查询的时候仍然是使用MY_INDEX进行查询,应该是做了映射。
2.4 插入数据
在company表中添加测试数据。
> upsert into company(id, name, address) values(‘001‘, ‘dimensoft‘, ‘nanjing‘);
- 1
2.5 查询数据
查看company表数据以及索引表my_index数据。
> select * from company;
> select * from my_index;
- 1
- 2
从HBase的CLI界面查看索引表_LOCAL_IDX_COMPANY。
> scan ‘_LOCAL_IDX_COMPANY‘
- 1
3个索引字段_INDEX_ID、NAME和ID的值被合并为索引表的rowKey,其中_INDEX_ID并没有值(\x000是十六进制表示,转换为字符串是空格)。