Solr-Hbase 二级索引的实现
为什么HBase要建立二级索引
在HBase中检索数据通常有以下三种方式:
- 通过get, 指定RowKey获取唯一一条记录
- 通过scan, 设置start和stop进行范围匹配
- 全表扫描
所以我们发现, 想要精确且快速的定位在HBase表中某一条记录, 唯一的办法也就是通过RowKey进行查询。 然而在多数情况, 需要从多个条件查询数据, 再依靠单一的Rowkey查询已经不满足需求。
方案
Hbase —–> Key Value Store —> Solr ——-> Web前端实时查询展示
Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。
Key-Value Store Indexer是Hbase到Solr生成索引的中间工具。在CDH5中的Key-Value Store Indexer使用的是Lily HBase NRT Indexer服务
Lily HBase Indexer是一款灵活的、可扩展的、高容错的、事务性的,并且近实时的处理HBase列索引数据的分布式服务软件。它是NGDATA公司开发的Lily系统的一部分,已开放源代码。Lily HBase Indexer使用SolrCloud来存储HBase的索引数据,当HBase执行写入、更新或删除操作时,Indexer通过HBase的replication功能来把这些操作抽象成一系列的Event事件,并用来保证写入Solr中的HBase索引数据的一致性。并且Indexer支持用户自定义的抽取,转换规则来索引HBase列数据。Solr搜索结果会包含用户自定义的columnfamily:qualifier字段结果,这样应用程序就可以直接访问HBase的列数据。而且Indexer索引和搜索不会影响HBase运行的稳定性和HBase数据写入的吞吐量,因为索引和搜索过程是完全分开并且异步的。Lily HBase Indexer在CDH5中运行必须依赖HBase、SolrCloud和Zookeeper服务。
部署流程
首先创建测试表, 开启REPLICATION复制功能实现集群间的相互复制
create 'table',{NAME => 'test', REPLICATION_SCOPE => 1}
# 1表示开启replication, 默认为0
对于已经存在的表
disable 'table'
alter 'table',{NAME => 'test', REPLICATION_SCOPE => 1}
enable 'table'
接下来在安装有Solr的主机上生成实体配置文件, 使用CDH自带的solrctl命令
solrctl instancedir --generate /opt/testindex/test
# 路径可以自定义
在生成的目录 /opt/testindex/test/ 中, 修改conf/solrconfig.xml, 这个是硬提交 会稍微影响性能
< autoCommit>
< maxTime>${solr.autoCommit.maxTime:60000}< /maxTime>
< openSearcher>true</ openSearcher>
</ autoCommit>
在conf/managed-schema文件中添加field
*注: 此步也可以省略, 推荐collection创建后在web管理页面中添加, 否则需要solr重启或field丢失
< field name=“testId” type=“string” indexed=“true” stored=“true” />
# name是自定义的索引名 后面要鱼Morphline.conf中的outputField属性对应
# type是字段类型
上传配置文件到zookeeper
solrctl instancedir --create test /opt/testindex/test
# --create后面跟自定义的名字
# 路径是刚刚定义的配置路径 instancedir
创建collection
solrctl collection --create test
# --create后面的名字必须和上一步的名字一致
collection创建后可以在8983/solr web管理面板上看到, 这时可以进入schema创建field
创建Lily HBase Indexer配置
在 之前定义的instancedir路径下 /opt/testindex/test 创建 morphline-hbase-mapper.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!--table属性指定hbase要建立索引的表-->
<indexer table="table" mapper="com.ngdata.hbaseindexer.morphline.MorphlineResultToSolrMapper"><!--value用来指定morphlines.conf文件的路径,绝对或者相对路径用来指定本地路径,如果是使用Cloudera Manager来管理morphlines.conf就直接写入值morphlines.conf"--><param name="morphlineFile" value="morphlines.conf"></param><!--这里value是自定义, 不过稍后需要在Key-Value Store Indexer配置Morphline中用到--><param name="morphlineId" value="test"></param>
</indexer>
进入CM管理界面中的Key-Value Store Indexer, 修改Morphline文件
注:
id: 一定要与刚刚morphline-hbase-mapper.xml中morphlineId的value一致
inputColumn: 需要写入到solr中的HBase列字段。值包含列族和列限定符, 并用’ : '分开。其中列限定符也可以使用通配符*来表示, 譬如可以使用c1:表示读取只要列族为data的所有hbase列数据
outputField: 用来表示morphline读取的记录需要输出的数据字段名称, 该名称必须和solr中的managed-schema文件的field节点自定义的name名称或者是在collection中设置的field保持一致,否则写入不正确
type: 用来定义读取HBase数据的数据类型HBase中的数据都是以byte[]的形式保存,但是所有的内容在Solr中索引为text形式,所以需要一个方法来把byte[]类型转换为实际的数据类型。type参数的值就是用来做这件事情的。现在支持的数据类型有:byte,int,long,string,boolean,float,double,short和bigdecimal。当然你也可以指定自定的数据类型,只需要实现com.ngdata.hbaseindexer.parse.ByteArrayValueMapper接口即可
SOLR_LOCATOR : {# Name of solr collectioncollection : hbaseindexer# ZooKeeper ensemblezkHost : "$ZK_HOST"
}morphlines : [
{
id : test
importCommands : ["org.kitesdk.**", "com.ngdata.**"]commands : [ {extractHBaseCells {mappings : [{inputColumn : "test:test_id"outputField : "testId" type : stringsource : value}]}}{ logDebug { format : "output record: {}", args : ["@{}"] } }
]
}
]
保存后重启 Key-Value Store Indexer 服务
最后, 注册 Lily HBase Indexer Configuration 和 Lily HBase Indexer Service
hbase-indexer add-indexer \
--name indexer \
--indexer-conf /opt/testindex/test/morphline-hbase-mapper.xml \
--connection-param solr.zk=node-01:2181,node-03:2181,node-05:2181/solr \
--connection-param solr.collection=cdc \
--zookeeper node-01:2181,node-03:2181,node-05:2181
注:
这里的 --name是指定indexer的name 可以自定义
–indexer-conf 是刚刚我们创建并且编辑好的morphline-hbase-mapper.xml的路径
solr.zk 哪个节点有solr就写哪个
solr.collection 指定创建好的collection
–zookeeper zookeeper节点
到这里部署就已经完成了, 这时向我们的表中put几条数据后再等个几秒钟就可以在solr上查询到对应的数据了.
命令汇总
# 列出所有indexer
hbase-indexer list-indexers
# 删除指定indexer
hbase-indexer delete-indexer --name XXX
# 列出所有collection
solrctl collection --list
# 删除collection
solrctl collection --delete XXX
# 列出所有instancedir
solrctl instancedir --list
# 删除instancedir
solrctl instancedir --delete XXX
写在最后
发现上面步骤中的test用的有点多, 大家还是根据自己的命名规则去用哈
如果上面写到的任何地方有问题请随时指出
Solr-Hbase 二级索引的实现相关推荐
- 【Solr - HBase二级索引 —— Lily HBase Indexer】
开门见山,直接上图,这图瞧着熟悉吧~哈哈哈 Reference https://blog.csdn.net/cafebar123/article/details/79405029
- 使用solr构建hbase二级索引
使用solr构建hbase二级索引 @(HBASE)[hbase, solr] 使用solr构建hbase二级索引 一概述 一业务场景描述 二技术方案 1技术方案一 2技术方案二 3关于索引的建议 二 ...
- CDH 6 安装 Hbase 二级索引 Solr + Key-Value Store Indexer
目录 一.集群安装Solr + Key-Value Store Indexer 二.创建Hbase二级索引 1.更改表结构,允许复制 2.创建相应的SolrCloud集合 3.创建 collecti ...
- Hbase 二级索引 Solr int字段排序问题 can not sort on multivalued field
Hbase Solr 同步二级索引后,进行int字段排序时报错 报错如下 {"responseHeader":{"zkConnected":true," ...
- 基于Solr的Hbase二级索引
关于Hbase二级索引 HBase 是一个列存数据库,每行数据只有一个主键RowKey,无法依据指定列的数据进行检索.查询时需要通过RowKey进行检索,然后查看指定列的数据是什么,效率低下.在实际应 ...
- hbase组合rowkey_「从零单排HBase 11」HBase二级索引解决方案
HBase一个令人惋惜的地方,就是不支持二级索引.因此,社区有了很多补充方案来填补HBase的二级索引能力的缺陷. 今天,我们就来看看有哪些二级索引方案,通过对比各个方案的优缺点,并结合我们的具体场景 ...
- 基于ES的HBase二级索引方案
HBase不支持多条件查询,不提供二级索引,难以满足用户对检索功能多样性和高效率两方面的需求.由索引模块的需求分析可知,本文解决通过,提出数据与索引的分离,利用HBase数据库的存储模式灵活多变,容纳 ...
- 华为HBase 二级索引调研
1.Overall Solution 解决思想: 一个user table对应一个index table index的创建与更新全部在RS端的cp-processor里实现 核心思想:一个actual ...
- hbase基于solr配置二级索引
一.概述 Hbase适用于大表的存储,通过单一的RowKey查询虽然能快速查询,但是对于复杂查询,尤其分页.查询总数等,实现方案浪费计算资源,所以可以针对hbase数据创建二级索引(Hbase Sec ...
- HBase+Solr 的 二级索引 实时查询
零.概述 1.Hbase适用于大表的存储,通过单一的RowKey查询虽然能快速查询,但是对于复杂查询,尤其分页.查询总数等,实现方案浪费计算资源,所以可以针对hbase数据创建二级索引(Hbase S ...
最新文章
- 18年第十三届黑龙江省赛
- [译] Fiber内幕:深入概述React新的协调算法
- python杂记-RSA加解密实现(4)-加解密消息及文件
- 深度学习入门篇(二)Lenet网络在caffe+QtCreator上部署应用
- POJ 1753 Flip Game(回溯)
- RocketMQ(十三)——实战-普通消息的发送与消费
- linux 删除文件
- elk收集分析nginx access日志
- SpringCloud整合Feign的调用源码流程解析
- 拉格朗日乘子法、惩罚函数法
- 【汇编实战开发笔记】80x86汇编基础的三大块知识
- 最新数据库设计实战应用案例--合同管理系统 非常经典的数据库设计案例教学 数据库设计
- 如何用js实现数组倒序输出
- TopCoder SRM 677 Div2
- postcss压缩 postcss-clean替换cssnano
- 【Debug】matlab中APP Designer,legend图例线条颜色一样
- 国产即时通讯软件如何选型?
- Python旅途休憩——闭包
- DataFrame使用pd.sample()随机选取N行数据
- SV function