Solr+Hbase多条件查(优劣互补)

为什么要使用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.              使用sqooporacle中的数据导入hbase

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

 

[html]  view plain  copy
  1. 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三列,其中idrowkey.

6.              创建索引

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

    

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /**  
  2.   
  3.      * create solrIndex   
  4.   
  5.      *   
  6.   
  7.      * @throws IOException  
  8.   
  9.      * @throws SolrServerException  
  10.   
  11.      */  
  12.   
  13.     public static void addIndex() throws IOException, SolrServerException {  
  14.   
  15.              // hbase  
  16.   
  17.              Scan scan = new Scan();  
  18.   
  19.              scan.addFamily(Bytes.toBytes(FAMILY_NAME));  
  20.   
  21.              // scan.setCaching(500);  
  22.   
  23.              scan.setCacheBlocks(false);  
  24.   
  25.              ResultScanner rs = table.getScanner(scan);  
  26.   
  27.   
  28.   
  29.              System.out.println("start......");  
  30.   
  31.              Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();  
  32.   
  33.              Long totalCount = 0l;  
  34.   
  35.              for (Result r : rs) {  
  36.   
  37.                       SolrInputDocument doc = new SolrInputDocument();  
  38.   
  39.                       doc.addField("id", new String(r.getRow()));  
  40.   
  41.                       for (KeyValue kv : r.raw()) {  
  42.   
  43.                                 String fieldName = new String(kv.getQualifier());  
  44.   
  45.                                 String fieldValue = new String(kv.getValue());  
  46.   
  47.                                 if (fieldName.equalsIgnoreCase("id")  
  48.   
  49.                                                   || fieldName.equalsIgnoreCase("title")  
  50.   
  51.                                                    || fieldName.equalsIgnoreCase("url")) {  
  52.   
  53.                                          doc.addField(fieldName, fieldValue);  
  54.   
  55.                                 }  
  56.   
  57.                                 docs.add(doc);  
  58.   
  59.                       }  
  60.   
  61.                       if (docs.size() >= 1000) {  
  62.   
  63.                                 cloudSolrServer.add(docs);  
  64.   
  65.                                 cloudSolrServer.commit();  
  66.   
  67.                                 totalCount = totalCount + docs.size();  
  68.   
  69.                                 docs = new ArrayList<SolrInputDocument>();  
  70.   
  71.                                 System.out.println("already deal with : " + totalCount);  
  72.   
  73.                       }  
  74.   
  75.              }  
  76.   
  77.     }  


 

7.              查询测试

     

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /**  
  2.   
  3.       * 1.query solrIndex pass some condition 2.query data from hbase pass rowkey  
  4.   
  5.       *   
  6.   
  7.       * @throws IOException  
  8.   
  9.       * @throws SolrServerException  
  10.   
  11.       */  
  12.   
  13.      public static void query() throws IOException, SolrServerException {  
  14.   
  15.               Get get = null;  
  16.   
  17.               List<Get> list = new ArrayList<Get>();  
  18.   
  19.               SolrQuery query = new SolrQuery("title:基金");  
  20.   
  21.               query.setStart(0);  
  22.   
  23.               query.setRows(40);  
  24.   
  25.               QueryResponse response = cloudSolrServer.query(query);  
  26.   
  27.               SolrDocumentList docs = response.getResults();  
  28.   
  29.               System.out.println("total:" + docs.getNumFound());  
  30.   
  31.               System.out.println("query time:" + response.getQTime());  
  32.   
  33.               //get rowkey from solr  
  34.   
  35.               for (SolrDocument doc : docs) {  
  36.   
  37.                        get = new Get(Bytes.toBytes((String) doc.getFieldValue("id")));  
  38.   
  39.                        list.add(get);  
  40.   
  41.               }  
  42.   
  43.               //order rowkey query data from hbase  
  44.   
  45.               for (Get gt : list) {  
  46.   
  47.                        Result result = table.get(gt);  
  48.   
  49.                        byte[] value = result.getValue("textinfo".getBytes(),  
  50.   
  51.                                           "title".getBytes());  
  52.   
  53.                        System.out.println("title------- \t" + new String(value));  
  54.   
  55.               }  
  56.   
  57.      }  


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

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

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值