何为Hbase的二级索引?
在hbase中并不是所有的查询维度都可以依靠rowkey来完成,rowkey的索引单一,对于多维度的查询比较困难,不是所有的列信息都包含在了rowkey中.一般的,当我们知道某一列的某一个值如F:C1-C11的时(F为列簇,C11为C1列下的具体值),但是并不知道其对应的rowkey,并且我们还想获取F:C2:C21的值.这时我们可以对F:C1这列建索引,我们需要做的是建立F:C1各列值和其各自对应行键rowkey之间的关系,通过C1下面的列值找到各自对应的rowkey,再通过rowkey就可以获取其它列的值了.
图示:
一般地,我们会将二级索引放在另一个列簇下,为了将索引数据与主数据分开存储(因为在HBase中同一列族的数据会被压缩在一起存储),可以设计索引的rowkey格式为:地名-索引名-单个或多个维度的具体值-对应主数据的rowkey.而且我们在设计索引数据的行键和主数据的行键的前缀都以同样的维度(比如地名),这样在存储时相同地名的索引数据和主数据是存储在同一个Region中的,避免了在通过索引得到rowkey后又去其他Region上查询目标数据,提高了查询效率.
Hbase协处理器介绍
hbase在0.92版本之后引进了协处理器:Coprocessor,能够比较轻易的实现二级索引和复杂过滤器(谓词下推)以及访问控制.
协处理器一般分为两种:observer和endpoint
首先,咱们了解observer:
observer主要是在regionServer和region,Master,WAL,EndPoint,BulkLoad处有动作.
● RegionObserver:提供客户端的数据操纵事件钩子:Get、Put、Delete、Scan 等。
● WALObserver:提供 WAL 相关操作钩子。
● MasterObserver:提供 DDL-类型的操作钩子。如创建、删除、修改数据表等。
比如一个put请求,利用的是RegionObserver接口,作用点在请求region之前(pre)和region处理之后(post).
- 1.client端请求put
- 2.请求被分发到RegionServer和Region
- 3.coprocessorHost拦截请求,然后在该表登记的RegionObserver上调用prePut()
- 4.如果没有被prePut拦截,请求继续到达region,put处理
- 5.region产生的结果继续被CoprocessorHost拦截,调用postPut()
- 6.如果没有postPut()拦截该响应,最终的结果返回给客户端
Observer Coprocessor 是一些散布在Hbase Server端代码中的一些hook钩子,在固定的事件发生前后被调用.
其次,咱们了解EndPoint:
EndPoint是客户端调用EndPoint协处理器执行一段Server端的代码,并在Server端将结果返回到客户端进一步筛选处理.比如取最大值,max的聚合操作,如果所有的计算都在客户端,那么势必效率低下.但是利用CoProcessor,将求最大值的代码部署到Hbase Server端,先在Region端求出最大值,然后再在Region Server端求出最大值,然后再将最大值发送到client客户端,客户端然后再计算出各个Region的最大值.这样一级级计算,效率比只在client计算的效率要高很多.
EndPoint流程:
对比:
Observer可以实现权限管理,优先级的设置,监控,ddl控制,二级索引等功能
EndPoint可以实现min,max,avg,sum,distinct,group by等函数操作
协处理器的加载
协处理器的两种加载方式:静态(Static Load)和动态(Table Load).
- 静态加载(Static Load)
主要通过修改hbase-site.xml这个文件来实现,启动全局的aggregation,能够操作所有表上数据.
<property>
<name>hbase.coprocessor.user.region.classes</name>
<value>org.apache.hadoop.hbase.coprocessor.AggregateImplementation</value>
</property>
- 动态加载(Table Load)
通过Hbase shell来实现.流程如下:
hbase> disable 'tablename'
hbase> alter 'tablename', METHOD => 'table_att','coprocessor'=>'|org.apache.Hadoop.hbase.coprocessor.AggregateImplementation||'
hbase> enable 'tablename'
协处理器的卸载
hbase> disable 'tablename'
hbase> alter'tablename',METHOD=>'table_att_unset',NAME=>'coprocessor$1'
hbase> enable 'tablename'
利用Observer方式建立二级索引
hbase的二级索引是建立列中值与之对应rowkey的映射关系.我们一般利用协处理器Observer的方式建立二级索引.
具体的操作见博客:https://blog.csdn.net/qichangjian/article/details/88181494
版权声明:本文为博主原创文章,未经博主允许不得转载。