为什么要使用solr+hbase组合:

某电信项目中采用HBase来存储用户终端明细数据,供前台页面即时查询。HBase无可置疑拥有其优势,但其本身只对rowkey支持毫秒级的快速检索,对于多字段的组合查询却无能为力。针对HBase的多条件查询也有多种方案,但是这些方案要么太复杂,要么效率太低,本文只对基于Solr的HBase多条件查询方案进行测试和验证。

solr+habse组合的原理:

基于Solr的HBase多条件查询原理很简单,将HBase表中涉及条件过滤的字段和rowkey在Solr中建立索引,通过Solr的多条件查询快速获得符合过滤条件的rowkey值,拿到这些rowkey之后在HBASE中通过指定rowkey进行查询。

环境

1.              已搭建好的hadoop集群,3节点hadoop测试集群(见文档hadoop2.5完全分布式集群搭建)

2.              在hadoop集群之上搭建hbase集群(文档中hadoop2.5分布式中已包含)

3.              已搭建好的solrcloud集群,3节点solrcloud集群(见文档solrcloud分布式集群)

4.              从oracle中导入数据到hbase中(可以通过普通java代码或mapreduce,也可以直接使用工具sqoop)

5.              使用sqoop将oracle中的数据导入hbase中

sqoop实现数据从oracle导入hdfs(hbase)

sqoop import --append --connect jdbc:oracle:thin:@192.168.0.20:1521:orcl --username yqdev --password yq --m 1 --table c_text --columns id,url,title --hbase-create-table --hbase-table c_text --hbase-row-key id --column-family textinfo

注:需要在hbase中先创建c_text表,创建列族textinfo;我只导入了id,url,title三列,其中id为rowkey.

6.              创建索引

从hbase中读取数据,将需要用作查询字段添加索引到solr中(例如title)

  /**
* create solrIndex
*
* @throws IOException
* @throws SolrServerException
*/
public static void addIndex() throws IOException, SolrServerException {
// hbase
Scan scan = new Scan();
scan.addFamily(Bytes.toBytes(FAMILY_NAME));
// scan.setCaching(500);
scan.setCacheBlocks(false);
ResultScanner rs = table.getScanner(scan);
System.out.println("start......");
Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
Long totalCount = 0l;
for (Result r : rs) {
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", new String(r.getRow()));
for (KeyValue kv : r.raw()) {
String fieldName = new String(kv.getQualifier());
String fieldValue = new String(kv.getValue());
if (fieldName.equalsIgnoreCase("id")
|| fieldName.equalsIgnoreCase("title")
|| fieldName.equalsIgnoreCase("url")) {
doc.addField(fieldName, fieldValue);
}
docs.add(doc);
}
if (docs.size() >= 1000) {
cloudSolrServer.add(docs);
cloudSolrServer.commit();
totalCount = totalCount + docs.size();
docs = new ArrayList<SolrInputDocument>();
System.out.println("already deal with : " + totalCount);
}
}
}

7.              查询测试

 /**
* 1.query solrIndex pass some condition 2.query data from hbase pass rowkey
*
* @throws IOException
* @throws SolrServerException
*/
public static void query() throws IOException, SolrServerException {
Get get = null;
List<Get> list = new ArrayList<Get>();
SolrQuery query = new SolrQuery("title:基金");
query.setStart(0);
query.setRows(40);
QueryResponse response = cloudSolrServer.query(query);
SolrDocumentList docs = response.getResults();
System.out.println("total:" + docs.getNumFound());
System.out.println("query time:" + response.getQTime());
//get rowkey from solr
for (SolrDocument doc : docs) {
get = new Get(Bytes.toBytes((String) doc.getFieldValue("id")));
list.add(get);
}
//order rowkey query data from hbase
for (Get gt : list) {
Result result = table.get(gt);
byte[] value = result.getValue("textinfo".getBytes(),
"title".getBytes());
System.out.println("title------- \t" + new String(value));
}
}

hbase+solr多条件查询的设计方案:

(利用hbase的大数据存储和solr的强大的索引,达到互补的效果)

基于Solr的HBase多条件查询原理很简单,将HBase表中涉及条件过滤的字段和rowkey在Solr中建立索引,通过Solr的多条件查询快速获得符合过滤条件的rowkey值,拿到这些rowkey之后在HBASE中通过指定rowkey进行查询。

参考:http://www.cnblogs.com/chenz/articles/3229997.html

Solr+Hbase多条件查(优劣互补)相关推荐

  1. 基于Solr的HBase多条件查询测试

    背景: 某电信项目中采用HBase来存储用户终端明细数据,供前台页面即时查询.HBase无可置疑拥有其优势,但其本身只对rowkey支持毫秒级的快速检索,对于多字段的组合查询却无能为力.针对HBase ...

  2. python实现hbase增删改查

    一.hbase shell创建命名空间 hbase shell create_namespace "gofish" 二.python实现hbase增删改查 # -*- coding ...

  3. solr的多条件组合查询

    今天,再工作中遇到了solr的多条件组合查询,于是在网上查到一些博客--多条件查询,这篇写的不错,但是我也想把我自己的记录下来.话不多说,直接放代码.注意:,在接收的参数由于都是String类型的,所 ...

  4. solr的多条件组合查询和solr的范围查询【转】

    solr的多条件组合查询和solr的范围查询 版权声明:本文为博主原创文章,供大家参考,但不要抄袭哦! 存在问题:为了减轻数据库的访问压力,往往我们将必要的数据存储到solr中,并给部分字段建立索引, ...

  5. 约束优化问题的一阶条件(KKT条件)、互补松弛条件、拉格朗日对偶问题、SVM

    简要概述 考虑约束优化问题时,可将等式拆解转化为不等式,方便求解,一阶时为KKT条件 KKT条件应用在SVM中 详细 ------ 链接: https://zhuanlan.zhihu.com/p/5 ...

  6. hive与hbase整合方式和优劣

    分别安装hive 和 hbase 1.在hive中创建与hbase关联的表 create table ganji_ranks (row string,num string) STORED BY 'or ...

  7. Excel 如何用条件查出行,并导出行到新表

    在使用Excel时,有时需要查出相应符合条件的信息行(从一个文件或多个文件中),条件可能是搜索多个关键字,可能是条件组合 ,导出来进行分析,那么如何方便快速来做这个事情呢? 需要使用复杂的工具,需要编 ...

  8. MybatisPlus多表联查分页多条件查

    一.mapper 注意: 1,${ew.customSqlSegment}不用管加上就行,主要作用是让wrapper中的sql自动拼接上去,分页会自动拼接@select中只需要让多表关联上就行 2,g ...

  9. Linux中的MySQL查询中文条件查不出来解决办法

    代码环境: 使用的框架是Springboot+MyBatis,运行方式是用IDEA打war包,然后cmd:java -jar 包名.war运行在服务器上. 遇到的问题: 在windows上配置的mys ...

最新文章

  1. “智源-MagicSpeechNet 家庭场景中文语音数据集挑战赛”上线
  2. Round Robin 算法
  3. win7系统Myeclipse下切换SVN用户
  4. 《分布式操作系统》部分知识点整理
  5. 23种设计模式[5]:原型模式
  6. Visual Studio的未来特性展望
  7. Knowledge Test about Match
  8. Nginx+PHP实时生成不同尺寸图片
  9. 设计师面试提前准备好这10个面试问题,助你面试成功
  10. WPF视频会议系统资料
  11. java的反射机制的好处
  12. python随机森林变量重要性_随机森林如何评估特征重要性【机器学习面试题详解】...
  13. sysdig_Sysdig: 系统故障排查利器
  14. 为什么Next-Key Lock可以解决幻读问题
  15. 【gev】 Golang 实现轻量、快速的基于 Reactor 模式的非阻塞 TCP 网络库
  16. 安装GPU版本的pytorch
  17. DEM数据知识介绍-数字高程模型
  18. opencv学习八:高斯模糊和边缘保留滤波EPF
  19. 用 Python 绘制个人足迹地图
  20. HTML字母导航栏怎么做,html导航栏下拉菜单怎么制作?这里有详细的代码实例

热门文章

  1. 苹果通知推送服务(APNS)关键特性摘要
  2. 查看win10版本方法,及win10升级方法
  3. 最稳定的Nginx绿色环境,可无限自定义PHP和mysql版本、同时运行N个版本
  4. CentOS 7配置静态IP地址 解决了IP失效问题
  5. Backbone.js源码解读(转载)
  6. Python 标准库 18.5 - asyncio
  7. CONTROLLER_NAME 常量 当前访问的控制器
  8. Hibernate配置数据源,数据库连接池
  9. 点击事件为什么会失效_1917年的法蒂玛事件,为什么会被称为最为惊悚的UFO目击事件?...
  10. linux搭建springBoot环境,SpringBoot Linux服务化部署