二级索引方案
协处理器的概念、作用和类型不介绍,可以参看:http://www.cnblogs.com/ventlam/archive/2012/10/30/2747024.html,官方blog:https://blogs.apache.org/hbase/entry/coprocessor_introduction
协处理器其中的一个作用是使用Observer创建二级索引。先举个实际例子:
我们要查询指定店铺指定客户购买的订单,首先有一张订单详情表,它以被处理后的订单id作为rowkey;其次有一张以客户nick为rowkey的索引表,结构如下:
rowkey family
dp_id+buy_nick1 tid1:null tid2:null ...
dp_id+buy_nick2 tid3:null
...
该表可以通过Coprocessor来构建,实例代码:
public class TestCoprocessor extends BaseRegionObserver {
@Override
public void prePut(final ObserverContext<RegionCoprocessorEnvironment> e,
final Put put, final WALEdit edit, final boolean writeToWAL)
throws IOException {
Configuration conf = new Configuration();
HTable table = new HTable(conf, "index_table");
List<KeyValue> kv = put.get("data".getBytes(), "name".getBytes());
Iterator<KeyValue> kvItor = kv.iterator();
while (kvItor.hasNext()) {
KeyValue tmp = kvItor.next();
Put indexPut = new Put(tmp.getValue());
indexPut.add("index".getBytes(), tmp.getRow(), Bytes.toBytes(System.currentTimeMillis()));
table.put(indexPut);
}
table.close();
}
}
即继承BaseRegionObserver类,实现prePut方法,在插入订单详情表之前,向索引表插入索引数据。
索引表的使用
先在索引表get索引表,获取tids,然后根据tids查询订单详情表。
当有多个查询条件(多张索引表),根据逻辑运算符(and 、or)确定tids。
使用时注意
1.索引表是一张普通的hbase表,为安全考虑需要开启Hlog记录日志。
2.索引表的rowkey最好是不可变量,避免索引表中产生大量的脏数据。
3.如上例子,column是横向扩展的(宽表),rowkey设计除了要考虑region均衡,也要考虑column数量,即表不要太宽。建议不超过3位数。
4.如上代码,一个put操作其实是先后向两张表put数据,为保证一致性,需要考虑异常处理,建议异常时重试。
效率情况
put操作效率不高,如上代码,每插入一条数据需要创建一个新的索引表连接(可以使用htablepool优化),向索引表插入数据。即耗时是双倍的,对hbase的集群的压力也是双倍的。当索引表有多个时,压力会更大。
查询效率比filter高,毫秒级别,因为都是rowkey的查询。
如上是估计的效率情况,需要根据实际业务场景和集群情况而定,最好做预先测试。
Coprocessor二级索引方案优劣
优点:在put压力不大、索引region均衡的情况下,查询很快。
缺点:业务性比较强,若有多个字段的查询,需要建立多张索引表,需要保证多张表的数据一致性,且在hbase的存储和内存上都会有更高的要求。
分享到:
相关推荐
使用Hbase协作器(Coprocessor)同步数据到ElasticSearch(hbase 版本 1.2.0-cdh5.8.0, es 2.4.0 版本)源代码
讲师:陈杨——快手大数据高级研发工程师 ...内容概要:(1)讲解hbase coprocessor的原理以及使用场景,(2) coprocessor整个流程实战,包括开发,加载,运行以及管理(3)结合1,2分析coprocessor在rsgroup中的具体使用
测试代码,目的是借助solr实现hbase二级索引,以使hbase支持高效的多条件查询。主要通过hbase的coprocessor的Observer实现,通过coprocessor在记录插入hbase时向solr中创建索引。 项目核心为...
1、有多个工具可选择使用
hbase分页查询实现.pdf
Hbase有着先天的优势和先天的劣势,而劣势就是其较差的数据定位能力,也就是数据查询能力。因为面向列的特点,Hbase只能单单地以rowkey为主键作查询,而无法对表进行多维查询和join操作,并且查询通常都是全表扫描,耗费...
为解决现有的HBase数据压缩策略选择方法未考虑数据的冷热性,以及在选择过程中存在片面性和不可靠性的缺陷,提出了基于...仿真实验及结果表明,提出的压缩策略选择方法不仅节省了存储空间,还大大提高了数据查询的性能。
kettle集群搭建以及使用kettle将mysql数据转换为Hbase数据
springboot搭建的hbase可视化界面 支持hbase的建表与删除 支持根据rowkey查询数据
HBaseCoprocessor的实现与应用.pdf
hbase分页查询实现
在hbtc2012上的发言,介绍hbase coprocessor的优化。hbase的cp是其自带的分布式并行计算框架。
本文当是一个基于HBase的海量数据的实实时查询系统的原理分析。详细的介绍了大数据查询的原理。
手把手视频详细讲解项目开发全过程,需要的小伙伴...7. 基于Phoenix消息数据查询 第三章 HBase高级 1. 重要工作机制 2. HBase批量装载——Bulk load 3. HBase的协处理器(Coprocessor) 4. HBase事务 5. HBase数据结构
使用spark读取hbase中的数据,并插入到mysql中
HBase-coprocessor
hbase分页查询实现[归类].pdf
里面包括了特定场合下,HBase随机查询的一些性能指标参考以及调优策略
通过条件查询hbase数据导出csv,文本,html等文件,实现方式:将hbase关联hive,然后将hive数据导入真实表,在将真实表数据导入sql数据库