0 HBase简介HBase是一个构建在HDFS之上,用于海量数据存储分布式列存储系统 。
- 表的每行都是按照RowKey的字典序排序存储
- 表的数据是按照RowKey区间进行分割存储成多个region
- 适用于基于rowkey的单行数据快速随机读写
- 适合基于rowkey前缀的范围扫描
二级索引的思想:简单理解就是,根据列族的列的值,查出rowkey,再按照rowkey就能很快从hbase查询出数据,我们需要构建出根据列族的列的值,很快查出rowkey的方案 。
2 常见的二级索引方案
- MapReduce方案;
- Coprocessor方案;
- elasticsearch+hbase方案;
- Solr+hbase方案;
举例: 原表:
row1f1:namezhangsanrow2f1:namelisirow3f1:namewangwu
索引表:rowzhangsanf1:id1rowlisif1:id2rowwangwuf1:id3
这种方式的思想是再构建一张hbase表,列族的列这里的name作为索引表的rowkey,根据rowkey查询出数据hbase是很快的,拿到id后,也就拿到了原表的rowkey了,因为源表的rowkey就是id,每次查询一共需要查询两张表 。2.2 Coprocessor方案有关协处理器的讲解,Hbase官方文档是最好的,这里大体说一下它的作用与使用方法 。
- Coprocessor提供了一种机制可以让开发者直接在RegionServer上运行自定义代码来管理数据 。通常我们使用get或者scan来从Hbase中获取数据,使用Filter过滤掉不需要的部分,最后在获得的数据上执行业务逻辑 。但是当数据量非常大的时候,这样的方式就会在网络层面上遇到瓶颈 。客户端也需要强大的计算能力和足够大的内存来处理这么多的数据,客户端的压力就会大大增加 。但是如果使用Coprocessor,就可以将业务代码封装,并在RegionServer上运行,也就是数据在哪里,我们就在哪里跑代码,这样就节省了很大的数据传输的网络开销 。
- 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来维持一个二级索引 。正是我们需要的
文章插图
我们的需求是找出满足cf1:col2=c22这条记录的cf1:col1的值,实现方法如图,首先根据cf1:col2=c22查找到该记录的行键,然后再通过行健找到对应的cf1:col1的值 。其中第二步是很容易实现的,因为Hbase的行键是有索引的,那关键就是第一步,如何通过cf1:col2的值找到它对应的行键 。很容易想到建立cf1:col2的映射关系,即将它们提取出来单独放在一张索引表中,原表的值作为索引表的行键,原表的行键作为索引表的值,这就是Hbase的倒排索引的思想 。
虽然官方一直也没提供内置的支持二级索引的工具,不过业界也有些比较知名的基于Coprocessor的开源方案:
- 华为的hindex : 基于0.94版本,当年刚出来的时候比较火,但是版本较旧,看GitHub项目地址最近这几年就没更新过 。
推荐阅读
- 钟情妄想的轻度表现是什么?
- 口干舌燥是上火吗
- 饿的恶心想吐怎么办?
- 背上长痘痒
- 热的恶心想吐怎么办?
- 胃可以做微创手术吗
- 鼻饲的注意事项有哪些?
- 现在开奔驰宝马的人越来越多了,奔驰宝马很贵开的人却很多-
- 朱元璋的殉葬的妃子死法究竟有多惨-来看看!,朱元璋有多少女人陪葬-
- 广东肠粉的米浆是用什么米做成的,肠粉的粉浆是用什么粉做的-