`
wbj0110
  • 浏览: 1588082 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Hbase和solr在海量数据查询中的应用

阅读更多

对于历史数据的查询,在数据规模不大的情况下,可以用传统的关系型数据库,如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 {
 /**
  * 建立solr索引
  */
 public void postPut(final ObserverContext<RegionCoprocessorEnvironment> e,
   final Put put, final WALEdit edit, final boolean writeToWAL)
   throws IOException {
  byte[] rowKey = put.getRow();
  String rowKeyStr = new String(rowKey, "UTF-8");
  List<KeyValue> kv = put
    .get("cf".getBytes(), Bytes.toBytes("orderTime"));
  String orderTime = new String(kv.get(0).getValue(), "UTF-8");

  List<KeyValue> kv2 = put.get("cf".getBytes(), Bytes.toBytes("userNum"));
  String userNum = new String(kv2.get(0).getValue(), "UTF-8");

  String solrUrl = "http://10.1.1.57:8082/solr";
  SolrServer solr = null;
  try {
   solr = new CommonsHttpSolrServer(solrUrl);
  } catch (MalformedURLException err) {
   // TODO Auto-generated catch block
   err.printStackTrace();
  }
  SolrInputDocument siDoc = new SolrInputDocument();
  siDoc.addField("id", rowKeyStr);
  siDoc.addField("rowkey", rowKeyStr);
  siDoc.addField("orderTime", orderTime);
  siDoc.addField("userNum", userNum);
  try {
   solr.add(siDoc);
  } catch (SolrServerException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  } catch (IOException e2) {
   // TODO Auto-generated catch block
   e2.printStackTrace();
  }
  try {
   solr.commit();
  } catch (SolrServerException e3) {
   e3.printStackTrace();
  } catch (IOException e1) {
   e1.printStackTrace();
  }

 }

配置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";
  SolrServer solr2 = null;
  try {
   solr2 = new CommonsHttpSolrServer(solrUrlSlave);
  } catch (MalformedURLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
  String queryString = "q=userNum:1111002&orderDate=2012-10-12&startrow=1&pagesize=10&sort=orderDate+desc";
  SolrParams solrParams = SolrRequestParsers
    .parseQueryString(queryString);
  try {
   QueryResponse rsp = solr2.query(solrParams);
   SolrDocumentList docList=rsp.getResults();
//遍历该docList,到HBASE中查找   

//TODO
  } catch (SolrServerException e) {
   e.printStackTrace();
  }

 

当然关于solr的索引,需要考虑到sorl的HA,有很多策略,这里不做介绍了,后面出单独的章节做阐述

分享到:
评论

相关推荐

    hbase+solr创建二级索引完整操作

    HBase作为分布式列族数据库,能够处理海量数据,并提供快速随机读写能力。而Solr则是一款开源搜索平台,擅长全文检索及高级查询功能。结合这两者可以实现高效的数据管理和灵活的查询服务。 #### 二、环境准备与配置...

    solr+hbase

    Solr 和 HBase 是两种在大数据领域广泛应用的技术。Solr 是一个开源的全文搜索引擎,而 HBase 是基于 Hadoop 的分布式数据库系统。这两者结合使用,可以构建强大的实时搜索和分析平台,尤其适合处理海量非结构化数据...

    morphlines.confmorphline-hbase-mapper.xml

    总结来说,"morphlines.conf"和"morphline-hbase-mapper.xml"是HBase-Solr集成的关键配置文件,它们协同工作,帮助我们构建高效、可扩展的二级索引,从而提升对HBase中海量数据的查询性能。理解并熟练运用这两个配置...

    hbase-solr-rest-client

    通过REST接口,它将Solr的全文检索能力和HBase的海量数据存储优势相结合,为企业级应用提供了一种高效、灵活的数据查询解决方案。在大数据时代,这样的工具对于优化数据处理流程、提升用户体验具有重要意义。

    hbase-indexer

    **HBase-Indexer** 是一个工具,它允许用户通过Apache Solr来高效地对HBase中的数据进行索引和搜索。HBase是基于Google Bigtable设计的一个分布式、面向列的NoSQL数据库,适合处理海量半结构化或非结构化数据。而...

    hbase-1.1.2-bin.tar.gz

    HBase是Apache软件基金会的一个开源项目,它是一个分布式、面向列的NoSQL数据库,构建在Hadoop之上,非常适合处理海量数据。HBase提供了实时读写、强一致性以及水平扩展的能力,常用于大数据分析场景。 描述中的...

    HBase视频教程下载|基于微博数据应用的HBase实战开发

    在大数据热潮中,推出了NoSQL数据库,这种天生就为分布式存储而设计的技术,尤其以Apache HBase为代表,占领海量数据存储技术的大半壁江山。本教视从实战角度出来,向学员们手把手掌握HBase使用精髓,让学员达到如下...

    search big data with solr and hadoop

    - **RESTful API**:Solr提供了一个简单的RESTful接口,支持XML、JSON等多种数据格式,便于集成到不同的应用环境中。 - **集群化管理**:Solr支持集群部署,可以通过添加更多的节点来水平扩展系统的处理能力和容错性...

    hbase-0.90.5.tar.gz与hadoop0.20.2版本匹配

    6. **索引**:虽然HBase本身不支持复杂的索引,但可以通过二级索引或者外部索引工具如Solr或Elasticsearch来提升查询性能。 在安装HBase 0.90.5时,你需要先确保你的环境已经正确安装了Hadoop 0.20.2。安装步骤通常...

    hbase二级索引

    这样,即使在海量数据中,也能快速定位到目标行。 描述中提到的"hbase-transactional-tableindexed-master"可能是一个包含实现HBase二级索引和事务处理的项目或代码库。在HBase中,事务支持是相对有限的,主要是...

    HBase+官方文档-高清文字版

    10. **应用场景**:HBase广泛应用于日志分析、物联网数据存储、实时推荐系统等需要大量实时读写和海量数据处理的场景。 这份高清文字版的HBase官方文档,对于开发者、系统管理员和数据工程师来说,是一份宝贵的参考...

    hbase-0.98.24

    总之,HBase是大数据领域的关键组件,特别是在实时读写、大数据分析和海量存储场景下。"hbase-0.98.24"这个版本为用户提供了一个稳定且功能丰富的分布式数据库系统,能够处理大规模的非结构化数据。

    云HBase X-Pack数据存储检索分析平台(32页).pdf

    该平台融合了多种技术,包括Apache HBase、Phoenix、Spark以及Solr,以支持海量数据的一站式存储、检索和分析。在金融、风控、推荐、社交、电商、新闻、物联网、新零售等多个领域有广泛应用,助力企业实现数据智能化...

    hadoop storm hbase spark

    - **概念**:HDFS是一种分布式文件系统,设计用于在商用硬件集群上存储海量数据。 - **特点**: - 高容错性:即使部分节点发生故障,数据仍然可用。 - 支持大规模数据集:能够存储PB级别的数据。 - 可扩展性强:...

    HBase存储的研究与应用-PaperAsk检测报告.zip

    7. **应用案例**:HBase在互联网公司中广泛应用,如Facebook用于存储用户生成的内容,Twitter用于存储和检索推文,LinkedIn用于存储用户档案等。 8. **生态组件**:HBase生态系统包括Phoenix(SQL接口)、HBase ...

    solr-8.1.1.zip

    - Solr可以与Hadoop、HBase等大数据技术结合,处理海量数据的搜索需求。 - 使用SolrCloud,实现分布式索引和搜索,支持高可用性和水平扩展。 7. **开发与扩展** - Solr提供了丰富的开发接口,如Java API、...

    Scaling Big Data with Hadoop and Solr

    在Hadoop生态系统中,除了HDFS和MapReduce之外,还有许多其它组件,例如HBase(一个高可扩展的非关系型分布式数据库)、YARN(用于资源管理)、Zookeeper(用于集群管理)、Hive(用于查询和管理大数据)等。...

    hbase是什么共24页.pdf.zip

    总的来说,HBase是应对大数据挑战的重要工具,它为海量数据提供了高性能、可扩展的存储解决方案,是大数据领域中不可或缺的一员。理解并掌握HBase的原理和使用方法,对于从事大数据相关工作的人员来说,具有重要的...

    ⼤数据时代数据库-云HBase架构&⽣态&实践_阿里云.pdf

    在实际应用场景中,云HBase展现出高并发、海量存储的能力,适用于稀疏矩阵存储、图数据、时序数据、消息/订单存储等多种场景。例如,某车联网公司利用HBase处理每辆车10秒上传一次的轨迹数据,实现了300TB+的存储和...

Global site tag (gtag.js) - Google Analytics