HBase的二级索引种类和设计

0 HBase简介HBase是一个构建在HDFS之上,用于海量数据存储分布式列存储系统 。

  • 表的每行都是按照RowKey的字典序排序存储
  • 表的数据是按照RowKey区间进行分割存储成多个region
所以HBase主要适用下面这两种常见场景:
  • 适用于基于rowkey的单行数据快速随机读写
  • 适合基于rowkey前缀的范围扫描
1 为什么需要二级索引HBase的一级索引就是rowkey,我们仅仅能通过rowkey进行检索 。假设我们相对Hbase里面列族的列列进行一些组合查询,就只能全表扫描了 。表如果较大的话,代价是不可接受的,所以要提出二级索引的方案 。
二级索引的思想:简单理解就是,根据列族的列的值,查出rowkey,再按照rowkey就能很快从hbase查询出数据,我们需要构建出根据列族的列的值,很快查出rowkey的方案 。
2 常见的二级索引方案
  1. MapReduce方案;
  2. Coprocessor方案;
  3. elasticsearch+hbase方案;
  4. Solr+hbase方案;
2.1 MapReduce方案IndexBuilder:利用MR的方式构建Index 长处:并发批量构建Index 缺点:不能实时构建Index
举例: 原表:
row1f1:namezhangsanrow2f1:namelisirow3f1:namewangwu索引表:
rowzhangsanf1:id1rowlisif1:id2rowwangwuf1:id3这种方式的思想是再构建一张hbase表,列族的列这里的name作为索引表的rowkey,根据rowkey查询出数据hbase是很快的,拿到id后,也就拿到了原表的rowkey了,因为源表的rowkey就是id,每次查询一共需要查询两张表 。
2.2 Coprocessor方案有关协处理器的讲解,Hbase官方文档是最好的,这里大体说一下它的作用与使用方法 。
  1. Coprocessor提供了一种机制可以让开发者直接在RegionServer上运行自定义代码来管理数据 。通常我们使用get或者scan来从Hbase中获取数据,使用Filter过滤掉不需要的部分,最后在获得的数据上执行业务逻辑 。但是当数据量非常大的时候,这样的方式就会在网络层面上遇到瓶颈 。客户端也需要强大的计算能力和足够大的内存来处理这么多的数据,客户端的压力就会大大增加 。但是如果使用Coprocessor,就可以将业务代码封装,并在RegionServer上运行,也就是数据在哪里,我们就在哪里跑代码,这样就节省了很大的数据传输的网络开销 。
  2. Coprocessor有两种:Observer和Endpoint EndPoint主要是做一些计算用的,比如计算一些平均值或者求和等等 。而Observer的作用类似于传统关系型数据库的触发器,在一些特定的操作之前或者之后触发 。学习过Spring的朋友肯定对AOP不陌生,想象一下AOP是怎么回事,就会很好的理解Observer了 。Observer Coprocessor在一个特定的事件发生前或发生后触发 。在事件发生前触发的Coprocessor需要重写以pre作为前缀的方法,比如prePut 。在事件发生后触发的Coprocessor使用方法以post作为前缀,比如postPut 。Observer Coprocessor的使用场景如下: 2.1. 安全性:在执行Get或Put操作前,通过preGet或prePut方法检查是否允许该操作; 2.2. 引用完整性约束:HBase并不直接支持关系型数据库中的引用完整性约束概念,即通常所说的外键 。但是我们可以使用Coprocessor增强这种约束 。比如根据业务需要,我们每次写入user表的同时也要向user_daily_attendance表中插入一条相应的记录,此时我们可以实现一个Coprocessor,在prePut方法中添加相应的代码实现这种业务需求 。 2.3. 二级索引:可以使用Coprocessor来维持一个二级索引 。正是我们需要的
索引设计思想关键部分来了,既然Hbase并没有提供二级索引,那如何实现呢?先看下面这张图
HBase的二级索引种类和设计

文章插图
 
我们的需求是找出满足cf1:col2=c22这条记录的cf1:col1的值,实现方法如图,首先根据cf1:col2=c22查找到该记录的行键,然后再通过行健找到对应的cf1:col1的值 。其中第二步是很容易实现的,因为Hbase的行键是有索引的,那关键就是第一步,如何通过cf1:col2的值找到它对应的行键 。很容易想到建立cf1:col2的映射关系,即将它们提取出来单独放在一张索引表中,原表的值作为索引表的行键,原表的行键作为索引表的值,这就是Hbase的倒排索引的思想 。
虽然官方一直也没提供内置的支持二级索引的工具,不过业界也有些比较知名的基于Coprocessor的开源方案: