为什么HBase要建立二级索引

在HBase中检索数据通常有以下三种方式:

  1. 通过get, 指定RowKey获取唯一一条记录
  2. 通过scan, 设置start和stop进行范围匹配
  3. 全表扫描

所以我们发现, 想要精确且快速的定位在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 二级索引的实现相关推荐

  1. 【Solr - HBase二级索引 —— Lily HBase Indexer】

    开门见山,直接上图,这图瞧着熟悉吧~哈哈哈 Reference https://blog.csdn.net/cafebar123/article/details/79405029

  2. 使用solr构建hbase二级索引

    使用solr构建hbase二级索引 @(HBASE)[hbase, solr] 使用solr构建hbase二级索引 一概述 一业务场景描述 二技术方案 1技术方案一 2技术方案二 3关于索引的建议 二 ...

  3. CDH 6 安装 Hbase 二级索引 Solr + Key-Value Store Indexer

    目录 一.集群安装Solr +  Key-Value Store Indexer 二.创建Hbase二级索引 1.更改表结构,允许复制 2.创建相应的SolrCloud集合 3.创建 collecti ...

  4. Hbase 二级索引 Solr int字段排序问题 can not sort on multivalued field

    Hbase Solr 同步二级索引后,进行int字段排序时报错 报错如下 {"responseHeader":{"zkConnected":true," ...

  5. 基于Solr的Hbase二级索引

    关于Hbase二级索引 HBase 是一个列存数据库,每行数据只有一个主键RowKey,无法依据指定列的数据进行检索.查询时需要通过RowKey进行检索,然后查看指定列的数据是什么,效率低下.在实际应 ...

  6. hbase组合rowkey_「从零单排HBase 11」HBase二级索引解决方案

    HBase一个令人惋惜的地方,就是不支持二级索引.因此,社区有了很多补充方案来填补HBase的二级索引能力的缺陷. 今天,我们就来看看有哪些二级索引方案,通过对比各个方案的优缺点,并结合我们的具体场景 ...

  7. 基于ES的HBase二级索引方案

    HBase不支持多条件查询,不提供二级索引,难以满足用户对检索功能多样性和高效率两方面的需求.由索引模块的需求分析可知,本文解决通过,提出数据与索引的分离,利用HBase数据库的存储模式灵活多变,容纳 ...

  8. 华为HBase 二级索引调研

    1.Overall Solution 解决思想: 一个user table对应一个index table index的创建与更新全部在RS端的cp-processor里实现 核心思想:一个actual ...

  9. hbase基于solr配置二级索引

    一.概述 Hbase适用于大表的存储,通过单一的RowKey查询虽然能快速查询,但是对于复杂查询,尤其分页.查询总数等,实现方案浪费计算资源,所以可以针对hbase数据创建二级索引(Hbase Sec ...

  10. HBase+Solr 的 二级索引 实时查询

    零.概述 1.Hbase适用于大表的存储,通过单一的RowKey查询虽然能快速查询,但是对于复杂查询,尤其分页.查询总数等,实现方案浪费计算资源,所以可以针对hbase数据创建二级索引(Hbase S ...

最新文章

  1. 18年第十三届黑龙江省赛
  2. [译] Fiber内幕:深入概述React新的协调算法
  3. python杂记-RSA加解密实现(4)-加解密消息及文件
  4. 深度学习入门篇(二)Lenet网络在caffe+QtCreator上部署应用
  5. POJ 1753 Flip Game(回溯)
  6. RocketMQ(十三)——实战-普通消息的发送与消费
  7. linux 删除文件
  8. elk收集分析nginx access日志
  9. SpringCloud整合Feign的调用源码流程解析
  10. 拉格朗日乘子法、惩罚函数法
  11. 【汇编实战开发笔记】80x86汇编基础的三大块知识
  12. 最新数据库设计实战应用案例--合同管理系统 非常经典的数据库设计案例教学 数据库设计
  13. 如何用js实现数组倒序输出
  14. TopCoder SRM 677 Div2
  15. postcss压缩 postcss-clean替换cssnano
  16. 【Debug】matlab中APP Designer,legend图例线条颜色一样
  17. 国产即时通讯软件如何选型?
  18. Python旅途休憩——闭包
  19. DataFrame使用pd.sample()随机选取N行数据
  20. SV function

热门文章

  1. 当财务部的人会编程,会发生什么?Python实现自动化群发工资条
  2. python必备源代码-Python 自用代码(某方标准类网页源代码清洗)
  3. 控制算法-PID算法总结-从公式原理到参数整定解析(附C源码)
  4. 《算法导论》第19章-斐波那契堆 引入 19.1 斐波那契堆结构
  5. Unity与Android交互(双端通信)
  6. vue中的vxe-table中文文档
  7. 【百度人脸识别】》人脸对比接口的调用
  8. signal函数——自定义信号处理方式
  9. 十八 、 View 的工作原理(2)---理解 MeasureSpec
  10. XML是什么,它可以做什么?——写给XML入门者