对于历史数据的查询,在数据规模不大的情况下,可以用传统的关系型数据库,如oracle,mysql等,可以利用他们提供的索引功能,实现高效的查询。
但是当数据上升到一定规模后,用传统的关系型数据库就不太合适了,当然可以把数据存到分布式数据库HBase中。
HBase目前只支持对rowkey的一级索引,对于二级索引还不支持,当然可以把所有要索引的字段都拼接到rowkey中,根据hbase的filter功能进行查询,
如按照查找一个用户的一段时间的订单,rowkey可以这样设计,rowkey="100022333||2012-12-23:10:20||orderNum",由于hbase在存储时,默认按照rowkey进行排序,这样一个用户的历史数据会集中在一个region中,这样便于顺序的查找。用这种方式的一个弊端是对分页的功能支持的不好,分页所用的总count数量和rowNum,可以在corprocessor中实现记录数量的汇总,但是对于从哪条条记录开始rowNum,则不太好支持,并且总记录数量的汇总需要单独用coprocessor的endpoint来实现,这样就增加了计算量;如果放在客户端做分页,对海量数据来说,是不可行的。
当然可以在Hbase中对该表生成对应的索引表,有几个二级索引就有几张表,如主表的rowkey设计为rowkey="orderNum",那么索引表就是rowkey="usetNum||orderdate",cf="orderNum",同样也会有分页的问题。
下面提出一种sorl+hbase的方式,solr建立索引(solr支持分页的操作),hbase存储数据。
在往HBase写数据的过程中,建立solr索引,可以在HBase的coprocessor的observer功能中实现
public class SorlIndexCoprocessorObserver extends BaseRegionObserver { List<KeyValue> kv2 = put.get("cf".getBytes(), Bytes.toBytes("userNum")); String solrUrl = "http://10.1.1.57:8082/solr"; |
配置coprocessor
alter ‘t1′, METHOD => ‘table_att', ‘coprocessor'=> ‘hdfs:///xxx.jar|com.newcosoft.hadoop.hbase.SorlIndexCoprocessorObserver|1001
一个表上可以配置多个协同处理器,一个序列会自动增长进行标识。加载协同处理器(可以说是过滤程序)需要符合以下规则:
[coprocessor jar file location] | class name | [priority] | [arguments]
对于solr中的commit操作,commit提交后,索引flush到硬盘上,并触发listener,创造新的insexSearcher(新的insexReader,从硬盘中加载索引),这样后续的查询就用新的insexsearcher了对查询性能影响比较大。在批量导入的情况下,可以导入完成后,单独调用sorl的commit操作。
此处采用solr的master,slave方式,master提供索引构建,多个slave提供索引查询;对于master的commit操作,会产生一个新的snapshot,
slave上的Snappuller程序一般是在crontab上面执行的,它会去master询问,有没有新版的snapshot;一旦发现新的版本,slave就会把它下载下来,然后snapinstall。
当一个新的searcher被open的时候,会有一个缓存预热的过程,预热之后,新的索引才会交付使用;这里会控制Snappuller程序的执行频率,solr的优化这里不做深入。
从solr中根据索引字段以及startrow、pagesize查找出对应的历史订单orderNum list后,遍历该list,去hbase中进行查询
String solrUrlSlave = "http://10.1.1.59:8082/solr"; //TODO |
当然关于solr的索引,需要考虑到sorl的HA,有很多策略,这里不做介绍了,后面出单独的章节做阐述
相关推荐
文档描述了自己使用hbase和solr搭建的简单搜索功能!
基于HBase的车联网海量数据查询.pdf
本文当是一个基于HBase的海量数据的实实时查询系统的原理分析。详细的介绍了大数据查询的原理。
hbase indexer是负责将hbase的数据自动同步到solr中建立索引,不需要写代码将hbase的数据同步到solr中创建索引。尽少开发工作,和减少在在并发环境下手工创建索引可能带来性能问题。
Phoniex 可以让开发者在HBase数据集上使用SQL查询。Phoenix查询引擎会将SQL查询转换为一个或多个HBase scan,并编排执行以生成标准的JDBC结果集,对于简单查询来说,性能甚至胜过Hive。 标签:Phoniex
Nutch抓取指定网址数据,存储在HBase数据库中,存储过程由zookeeper管理。脚本调用索引器部件将数据索引化,经过索引化的数据被前端检索查询,最后前端展示查询结果,用户点击结果列表查看目标资料。
楼主实操的步骤整理的,只需要将Zookeeper的ip换成自己集群的就可以一步步地跟着文档实现,感兴趣的同学可以看看。
通过源码编译的,包含自带的hbase和solr
solr增强hbase检索...1547548620.pdf.
由于早期项目的客户服务器重新规划,原来部署应用的员工已离职且部署文档不完整,所以用三个虚机节点搭了简单的Hadoop+Hbase+Solr的环境并形成部署步骤文档给运维人员参考,有兴趣的可以下载一下,以上。
通过源码编译的apache-atlas-2.1.0-server.tar.gz 不含hbase和solr
基于HBase的网络社区海量数据存储优化研究,吴旭,郭建,基于HBase自动根据Rowkey排序表中数据的特性,在组织网络社区海量数据的存储结构时添加了时间戳以便按照时间段对海量数据进行查询,H
主要通过hbase的coprocessor的Observer实现,通过coprocessor在记录插入hbase时向solr中创建索引。 项目核心为SolrIndexCoprocessorObserver,该类继承BaseRegionObserver,并实现postPut和postDelete方法,以实现...
手把手视频详细讲解项目开发全过程,需要的小伙伴...7. 基于Phoenix消息数据查询 第三章 HBase高级 1. 重要工作机制 2. HBase批量装载——Bulk load 3. HBase的协处理器(Coprocessor) 4. HBase事务 5. HBase数据结构
Hbase有着先天的优势和先天的劣势,而劣势就是其较差的数据定位能力,也就是数据查询能力。因为面向列的特点,Hbase只能单单地以rowkey为主键作查询,而无法对表进行多维查询和join操作,并且查询通常都是全表扫描,耗费...
hbase海量数据的全量导入方法,大数据导入。
solr+hbase
该文档主要用于创建在solr中创建hbase的二级索引的教程,新建solr的分片,以及后续修改和新建配置文件等,仅供参考
在HBase基础上,提出了一个基于索引的气象结构化数据查询优化架构HBase4M(HBase for Meteorology)。首先,根据HBase存储特性设计表结构;然后,利用协处理器建立和维护辅助索引,将字段查询转化为对索引表的行键...
Hbase笔记 —— 利用JavaAPI的方式操作Hbase数据库(往hbase的表中批量插入数据)