Local Indexing

1. 说明



在HBase中,只有一个单一的按照字典序排序的rowKey索引,当使用rowKey来进行数据查询的时候速度较快,但是如果不使用rowKey来查询的话就会使用filter来对全表进行扫描,很大程度上降低了检索性能。而Phoenix提供了二级索引技术来应对这种使用rowKey之外的条件进行检索的场景。

Phoenix支持两种类型的索引技术:Global Indexing和Local Indexing,这两种索引技术分别适用于不同的业务场景(主要是偏重于读还是偏重于写)。下面分别对这两种索引技术简单使用一下,具体性能方面没有进行测试。

以上文字摘自官方文档

http://phoenix.apache.org/secondary_indexing.html

本篇主要介绍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是十六进制表示,转换为字符串是空格)。

时间: 2024-10-18 21:11:23

Local Indexing的相关文章

Append-only Data

1. 说明 觉得还是有必要把这种类型的索引说明一下,phoenix将其二级索引技术划分为global and local indexing 2种,但是如果继续往下细分的话又分为mutable global indexing.mutable local indexing.immutable global indexing.immutable local indexing一共四种. 默认创建的二级索引为mutable的(mutable global ing或者mutable local indexi

Indexing Sensor Data

In particular embodiments, a method includes, from an indexer in a sensor network, accessing a set of sensor data that includes sensor data aggregated together from sensors in the sensor network, one or more time stamps for the sensor data, and metad

【Nutch基础教程之七】Nutch的2种执行模式:local及deploy

在对nutch源码执行ant runtime后,会创建一个runtime的文件夹.在runtime文件夹下有deploy和local 2个文件夹. [[email protected] runtime]$ ls deploy  local 这2个文件夹分别代表nutch的2种执行方式:部署模式及本地模式. 1.nutch.sh中关于2种执行方式的执行 if $local; then # fix for the external Xerces lib issue with SAXParserFac

【Nutch基础教程之七】Nutch的2种运行模式:local及deploy

在对nutch源代码运行ant runtime后,会创建一个runtime的目录,在runtime目录下有deploy和local 2个目录. [[email protected] runtime]$ ls deploy  local 这2个目录分别代表nutch的2种运行方式:部署模式及本地模式. 以下以inject为例,示范2种运行模式. 一.本地模式 1.基本用法: $ bin/nutch inject Usage: InjectorJob <url_dir> [-crawlId <

弄清楚Solr Nodes, Cores, Clusters and Leaders , Shards and Indexing Data

https://cwiki.apache.org/confluence/display/solr/Nodes%2C+Cores%2C+Clusters+and+Leaders Nodes and Cores In SolrCloud, a node is Java Virtual Machine instance running Solr, commonly called a server. Each Solr core can also be considered a node. Any no

Importing/Indexing database (MySQL or SQL Server) in Solr using Data Import Handler--转载

原文地址:https://gist.github.com/maxivak/3e3ee1fca32f3949f052 Install Solr download and install Solr from http://lucene.apache.org/solr/. you can access Solr admin from your browser: http://localhost:8983/solr/ use the port number used in installation. M

Can&#39;t bind to local 8700 for debugger报错和解决

[2016-02-15 22:37:17 - ddms] Can't bind to local 8700 for debugger报错和解决 1.打开studio monitor是出错: Can't bind to local 8700 for debugger 2.netstat -apn |grep 8700(或者netstat -apo|findstr 8700)查询,得到的结果是: tcp6 0 0 123.0.0.1:8700  :::*     LISTEN   3665/java

Strong local nondeterminism for fBm

Let $B^\alpha$ be an $(N,1)$-fractional Brownian motion with index $\alpha\in(0,1).$ Pitt (Local times for Gaussian vector fields, Indiana Univ. Math. J. 1978) proved that $B^\alpha$ satisfies the following Strong local nondeterminism: there exists a

Android中JNI调用时出现accessed stale local reference的问题

之前在做一个native的模块时遇到这样一个问题: 代码运行在android2.3上没有任何问题,可是在4.2上运行时报出了:JNI ERROR (app bug): accessed stale local reference 的错误. 后来在StackOverflow上找到了问题的答案.简单来说就是  4.0以上的android系统GC在垃圾回收时为了减少内存碎片,会对内存进行整理,整理时必然会移动对象的内存地址,这时C代码的指针还指向原来对象的地址,这时该对象已经被移动到了其他位置,因此会