[原]自学大数据:基于Solr实现HBase的文本索引
前言
最近接触的项目中,需要针对HBase的数据进行索引查询,主要支持中文查询,分页查询等。在此情况下,学习了搜索服务器solr。总结了一些方法和经验,正好可以分享个大家,鼓励自己,共同学习。
使用目的
HBase目前只支持对rowkey的一级索引,对于二级索引还不支持,当然可以把所有要索引的字段都拼接到rowkey中,根据hbase的filter功能进行查询,但是这样操作数据会涉及到全表扫描,效率很低,速度慢,不利于后期扩展。并且,通过HBase自己的索引,实现数据量统计,分页,中文索引几乎不可能。所以,基于solr为HBase创建索引,就显得更有价值。
名词解析
Solr: Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。
原理
基于Solr的HBase多条件查询原理很简单,将HBase表中涉及条件过滤的字段和rowkey在Solr中建立索引,通过Solr的多条件查询快速获得符合过滤条件的rowkey值,拿到这些rowkey之后在HBASE中通过指定rowkey进行查询。
环境搭建
基于tomcat服务器搭建solr的运行环境,参照slor官网 Solr with Apache Tomcat
建立索引实现方式
目前主流的通过solr在HBase之上建立索引, 有三种方式:
1、 第一种方案是通过HBase的普通API获取数据建立索引
优点:HBase与Solr彼此没有任何耦合,通过外部java程序来控制索引的创建修改,整个系统的高可用性和容错性有保证。
缺点:效率较低。每秒处理125条数据(加大线程可以提高效率)
基于本人PC测试:
线程数设置为10个,每秒可以处理294条数据
线程数设置为20个,每秒可以处理410条数据
线程数设置为25个,每秒可以处理376条数据
线程数设置为30个,每秒可以处理382条数据
2、 第二种方案是用到HBase的Mapreduce框架
优点:分布式并行执行效率特别高,处理1000万条数据仅需5分钟
缺点:但是这种高并发需要对Solr服务器进行配置调优,不然会抛出服务器无法响应的异常。适合批量处理,数据量较小时不适合。
3、 第三种方案是在往HBase写数据的过程中,触发HBase的coprocessor的observer功能调用solr服务,建立solr索引。是在Base的中实现。
优点:外部调用端不需要考虑solr索引的建立问题,只需要调用HBase操作数据,索引的建立交给HBase调用Solr实现。
缺点:协处理器运行在和RegionServer相同的进程空间里,出错的协处理器有潜在可能使进程崩溃,导致HBase的数据出错。
综上所述,考虑到HBase集群的高可用性、容错性、扩展性等,建议主要使用第一种方案建立索引,第二种方案为辅助。