Lily HBase Indexer使用整理
来源:互联网 发布:正在准备设定windows 编辑:程序博客网 时间:2024/06/04 18:45
关于Key-Value Indexer组件
CDH5.3.2中的Key-Value 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服务。
Lily HBase NRT Indexer使用流程
使用Lily HBase做近实时索引处理。
1.HBase表启用replication
创建HBase表时启动列族的replication功能。使用如下命令:
create 'table',{NAME => 'cf', REPLICATION_SCOPE => 1} #其中1表示开启replication功能,0表示不开启,默认为0
如果是对于已创建的表,可以使用如下命令:
disable 'table'alter 'table',{NAME => 'cf', REPLICATION_SCOPE => 1}enable 'table'
2.创建一个你需要索引的Solr Collection
创建流程参看:http://blog.csdn.net/kissmelove01/article/details/45043955。需要说明的是,在schema.xml中uniqueKey必须为rowkey,而rowkey使用'id'字段表示,所以<field>中必须要有id字段,这个在Cloudera Search文档中并没有说明,查了很多资料才找到相关说明。其它需要索引字段根据用户需要自定义即可。
3.生成Lily HBase Indexer配置文件
在HBase-Solr的安装目录/usr/lib/hbase-solr/下,创建morphline-hbase-mapper.xml文件,文件内容如下:
$ cat $HOME/morphline-hbase-mapper.xml <?xml version="1.0"?><indexer table="record" mapper="com.ngdata.hbaseindexer.morphline.MorphlineResultToSolrMapper"> <!-- The relative or absolute path on the local file system to the morphline configuration file. --> <!-- Use relative path "morphlines.conf" for morphlines managed by Cloudera Manager --> <param name="morphlineFile" value="morphlines.conf"/> <!-- The optional morphlineId identifies a morphline if there are multiple morphlines in morphlines.conf --> <!-- <param name="morphlineId" value="morphline1"/> --> </indexer>
其中table表示需要索引的HBase表名称,上面为record表;mapper表示用来实现和读取指定的Morphline配置文件类,固定为MorphlineResultToSolrMapper。param中的name参数用来指定当前配置为morphlineFile文件,value用来指定morphlines.conf文件的路径,绝对或者相对路径用来指定本地路径,如果是使用Cloudera Manager来管理morphlines.conf就直接写入值“morphlines.conf”。注意:当使用绝对或者相对路径来指定路径时,集群中的其它机器也要在配置路径上有该文件,如果是通过Cloudera Manager管理的话只需要在CM中修改后即可,CM会自动分发给集群。当然该配置文件还有很多其它参数可以配置,具体可以参见:https://github.com/NGDATA/hbase-indexer/wiki/Indexer-configuration#table。
4.生成Morphlines配置文件
Morphlines是一款开源的,用来减少构建hadoop ETL数据流程时间的应用程序。它可以替代传统的通过MapReduce来抽取、转换、加载数据的过程,提供了一系列的命令工具,具体可以参见:http://kitesdk.org/docs/0.13.0/kite-morphlines/morphlinesReferenceGuide.html。对于HBase的其提供了extractHBaseCells命令来读取HBase的列数据。我们采用Cloudera Manager来管理morphlines.conf文件,使用CM来管理morphlines.conf文件除了上面提到的好处之外,还有一个好处就是当我们需要增加索引列的时候,如果采用本地路径方式将需要重新注册Lily HBase Indexer的配置文件,而采用CM管理的话只需要修改morphlines.conf文件后重启Key-Value HBase Indexer服务即可。具体操作为:进入Key-Value Store Indexer面板->配置->服务范围->Morphlines->Morphlines文件。在该选项加入如下配置:
morphlines : [ { id : morphline1 importCommands : ["org.kitesdk.morphline.**", "com.ngdata.**"] commands : [ { extractHBaseCells { mappings : [ { inputColumn : "data:opcode" outputField : "opcode" type : string source : value } { inputColumn : "data:source_id" outputField : "source_id" type : string source : value } { inputColumn : "data:source_seq" outputField : "source_seq" type : long source : value } { inputColumn : "data:username" outputField : "username" type : string source : value } { inputColumn : "data:account_id" outputField : "account_id" type : string source : value } { inputColumn : "data:product_id" outputField : "product_id" type : string source : value } #{ # inputColumn : "data:item" # outputField : "_attachment_body" # type : "byte[]" # source : value #} ] } } #for avro use with type : "byte[]" in extractHBaseCells mapping above #{ readAvroContainer {} } #{ # extractAvroPaths { # paths : { # data : /user_name # } # } #} { logTrace { format : "output record: {}", args : ["@{}"] } } ] }]
id:表示当前morphlines文件的ID名称。
importCommands:需要引入的命令包地址。
extractHBaseCells:该命令用来读取HBase列数据并写入到SolrInputDocument对象中,该命令必须包含零个或者多个mappings命令对象。
mappings:用来指定HBase列限定符的字段映射。
inputColumn:需要写入到solr中的HBase列字段。值包含列族和列限定符,并用‘ : ’分开。其中列限定符也可以使用通配符‘*’来表示,譬如可以使用data:*表示读取只要列族为data的所有hbase列数据,也可以通过data:my*来表示读取列族为data列限定符已my开头的字段值。
outputField:用来表示morphline读取的记录需要输出的数据字段名称,该名称必须和solr中的schema.xml文件的字段名称保持一致,否则写入不正确。
type:用来定义读取HBase数据的数据类型,我们知道HBase中的数据都是以byte[]的形式保存,但是所有的内容在Solr中索引为text形式,所以需要一个方法来把byte[]类型转换为实际的数据类型。type参数的值就是用来做这件事情的。现在支持的数据类型有:byte[](原封不动的拷贝hbase中的byte[]数据),int,long,string,boolean,float,double,short和bigdecimal。当然你也可以指定自定的数据类型,只需要实现com.ngdata.hbaseindexer.parse.ByteArrayValueMapper接口即可。
source:用来指定HBase的KeyValue那一部分作为索引输入数据,可选的有‘value’和'qualifier',当为value的时候表示使用HBase的列值作为索引输入,当为qualifier的时候表示使用HBase的列限定符作为索引输入。
5.注册Lily HBase Indexer配置文件到Lily HBase Indexer Service服务中
当前面的所有步骤完成之后,我们需要把Lily HBase Indexer的配置文件注册到Zookeeper中,使用如下命令:
hbase-indexer add-indexer -n batchrecordIndexer -c $HOME/morphline-hbase-mapper.xml --connection-param solr.zk=xhadoop1:2181,xhadoop2:2181,xhadoop3:2181,xhadoop4:2181,xhadoop5:2181/solr --connection-param solr.collection=batchrecord --zookeeper xhadoop1:2181,xhadoop2:2181,xhadoop3:2181,xhadoop4:21281,xhadoop5:2181
6.HBase写入数据
向HBase中配置的索引表写入数据,如下:
put 'record','row1','data:opcode','20035'put 'record','row1','data:source_id','p-sx1z1'put 'record','row2','data:opcode','20036'put 'record','row2','data:username','zhangsan'
当写入数据后,稍过几秒我们可以在相对于的solr中查询到该插入的数据,表明配置已经成功。
Lily HBase Batch Index使用流程
上面介绍了使用Lily HBase Indexer做近实时处理的流程,但是有些情况下我们可能HBase之前采用的别的二级索引机制,现在要迁移到Lily HBase Indexer上,或者由于人为的误操作导致配置schema.xml文件的时候少写入了一个索引字段,而这个时候HBase已经写入数据了,这种情况下该如何处理呢?那就需要用到Lily HBase Indexer的批处理索引功能了。使用步骤同Lily HBase NRT Indexer使用流程前4步。
5.运行HBaseMapReduceIndexerTool命令
Lily HBase Indexer提供了通过MapReduce来批量构建索引的方式,使用如下命令:
hadoop jar $HOME/tools/hbase-indexer-mr-1.5-cdh5.3.2-job.jar -D 'mapred.child.java.opts=-Xmx500M' --hbase-indexer-file $HOME/morphline-hbase-mapper.xml --zk-host xhadoop1:2181,xhadoop2:2181,xhadoop3:2181,xhadoop4:2181,xhadoop5:2181/solr --collection batchrecord --go-live
运行该命令前可以加入--dry-run参数来检测运行环境是否正常,并打印异常信息。HBaseMapReduceIndexerTool还提供了很多其它参数,具体可以参考:http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/search_hbase_mapreduce_indexer_tool.html。
运行以上命令需要值得说明的是:1.如果在批处理索引文件之前已经有索引数据写入到solr中,那么运行批处理文件之后,Solr索引数据会正常写入,但是当查询solr指定的rows小于整体索引的数据条目时,其返回的numFound值不准确,但是数据结果是正常的,如果想要numFound返回的值正常,可以采用先清空Solr索引,然后再执行批处理的方式。2.在批处理索引的过程中,我尝试同时向HBase中写入数据用来近实时索引,发现数据能写入HBase正常,但是索引数据没有的情况,并且容易导致Key-Value HBase Indexer的服务异常停止,我怀疑是否和服务器性能有关,后面还需要测试,如果有人测试验证可行的话,还望告知一下。
以上即为Lily HBase Indexer的使用整理情况。
- Lily HBase Indexer使用整理
- 使用Lily HBase Indexer
- Lily HBase Indexer在CDH中的基本使用
- hbase-indexer
- 深入理解HBase Indexer
- hbase-indexer环境搭建
- 深入理解HBase Indexer
- 初识Lily, Lily=Hadoop+Zookeeper+HBase+Solr
- Lily
- HBase学习笔记 --- 调研HBase Indexer
- HBase学习笔记 --- hbase-indexer WIKI
- Lily-建立在HBase上的分布式搜索
- HBase Indexer导致Solr与HBase数据不一致问题解决
- indexer和searchd的使用
- Lily:基于Solr、HBase、Zookeeper云计算上的内容仓库
- Lily:基于Solr、HBase、Zookeeper云计算上的内容仓库
- Lily:基于Solr、HBase、Zookeeper云计算上的内容仓库
- hbase技术文章整理
- 第八周项目零(4):阅读程序:运算符重载
- 利用CombineFileInputFormat处理小文件
- winnet http上传实现
- HDU 1213How Many Tables 并查集
- [Android初级]自定义SeekBar样式(简单说明)
- Lily HBase Indexer使用整理
- RFID第8章
- keil uvision4的两个小问题
- C#时间格式
- CentOS install Python 2.7.6 and 3.3.3
- SDWebImage探索总结
- hdu 3487 Play with Chain (Splay tree基础)
- Oracle sql判断一个字段是否全数字 或含有中文
- Ubuntu升级出现/boot空间不足解决