CDH HBASE使用solr创建二级索引,更新删除索引
转载: https://blog.csdn.net/u010936936/article/details/78064148?locationNum=10&fps=1
关于为什么要创建hbase二级索引,这里不再赘述,直接开始安装配置
1.环境准备
①安装HBASE,solr, Key-Value Store Indexer,这些在CDH的服务里面都有
②进入CM HBASE配置页面,打开复制和编制索引:
2. 建表
首先,在HBASE SHELL建立一张表如下:
hbase(main):024:0> create 'test3',{NAME=>'c1',REPLICATION_SCOPE => '1'}
如果表已经存在,则使用如下来更改表:
disable '表名'
alter '表名',{NAME =>'列族名', REPLICATION_SCOPE =>1}
enable '表名'
3.创建相应的SolrCloud集合
注意要在安装有solr的节点执行,可在CM中查看solr实例,确定solr节点
①生成实体配置文件:
[root@kjtlxsvr5 ~]# solrctl instancedir --generate $HOME/hbase-indexer/test3
注: I. 要知道命令如何使用,比如solrctl命令,可以直接键入solrctl,回车,可以看到帮助。然后再键入solrctl instancedir,
回车,即可知道子命令如何使用。下面将要使用的命令也依此类推,即可知道用法。
II. --generate 后的路径由自己指定。
②命令完成后会在指定的路径下生成目录,目录下有个子目录conf,修改conf中的schema.xml,在最后添加一个节点如下:
<field name="test3name" type="string" indexed="true" stored="true" />
属性解析:name:这里的name是自定义,但是后面要使用到,要和后面的Morphline.conf文件中的outputField属性
对应。
type:字段类型
indexed:是否建立索引
stored:是否存储
③修改 solrconfig.xml,找到下面的配置片段,将false改为true,这个是硬提交,会影响性能
<autoCommit>
<maxTime>${solr.autoCommit.maxTime:60000}</maxTime>
<openSearcher>true</openSearcher>
</autoCommit>
④上传配置文件到zookeeper。
solrctl instancedir --create test3 $HOME/hbase-indexer/test3
注:命令如何使用参照上面说的方法。
--create 后接name,此name自定义,它决定在zookeeper上保存的目录名,接下来要创建的collection名,在索引创建完成后在solr web页面上看到的core selector名。如果已经存在,会有提示,或更新,或改名
name后是配置的路径,即刚才solrctl instancedir --generate所自定义的路径
⑤上传后,zk会自己同步配置,然后创建collection,分单节点存储检索和多节点存储检索两种情况,如下:
I.单节点情况下:
solrctl collection --create test3
注:--create 后接name,此name必须和上一步的name一致,不然找不到配置文件;
II. 多节点情况下:如果希望将数据分散到各个节点进行存储和检索,则需要创建多个shard,需要使用如下命令,solr集群共4个solrserver:
solrctl collection --create test6 -s 7 -m 6 -r 3 -c test6 -a
注:其中-s是7个分片(shard),我的solrserver集群共4个节点,-r是3个副本(replication),-c是指定zk上solr/configs节点下使用的配置文件名称,-a是允许添加副本(必须写,否则创建不了副本),-m 默认值是1,此处设为6,注意三个数值:numShards、replicationFactor、liveSolrNode,一个正常的solrCloud集群不容许同一个liveSolrNode上部署同一个shard的多个replic,因此当maxShardsPerNode=1时,numShards*replicationFactor>liveSolrNode时,报错。因此正确时因满足以下条件:
numShards*replicationFactor<=liveSolrNode*maxShardsPerNode,放在命令中,公式即:
-m * 存活的solrserver节点数 >= -s * -r,含义:每个节点最大分片数*存活的solr节点 >= 分片数*副本数
这样分布后,在soloweb页面上可以直观看到它们的分布情况,以及这些参数产生的影响,如下:
当创建collection命令完成后,可以在solr 的web页面上看到test3开头的选择器,只不过没有数据。
⑥创建 Lily HBase Indexer 配置
在$HOME/hbase-indexer/test3目录下,创建morphline-hbase-mapper.xml文件,内容如下。
<?xml version="1.0"?>
<indexer table="test3" mapper="com.ngdata.hbaseindexer.morphline.MorphlineResultToSolrMapper">
<param name="morphlineFile" value="morphlines.conf"/>
<param name="morphlineId" value="test3Map"/>
</indexer>
注:table属性表示hbase中要建立索引的表
value="morphlines.conf",value用来指定morphlines.conf文件的路径,绝对或者相对路径用来指定本地路径,如果是使用Cloudera Manager来管理morphlines.conf就直接写入值morphlines.conf
value="test3Map",这里test3Map是自定义,接下来要使用。其他的mapper,param name等属性默认即可
4.配置Morphline 文件
通过CM页面进入到Key-Value Store Indexer的配置页面,里面有一个Morphlines文件。修改它:
SOLR_LOCATOR :{
# Name of solr collection
#collection : bqjr
# ZooKeeper ensemble
zkHost :"$ZK_HOST"
}
morphlines :[
{
id : test3Map
importCommands :["org.kitesdk.**","com.ngdata.**"]
commands :[
{
extractHBaseCells {
mappings :[
{
inputColumn :"c1:name"
outputField :"test3name"
type :string
source : value
}
]
}
}
{ logDebug { format :"output record: {}", args :["@{}"]}}
]
}
]
修改后,保存,重启Key-Value Store Indexer。
注: id:表示当前morphlines的名称,与上一步的value="test3Map"要一致
importCommands:需要引入的命令包地址
extractHBaseCells:该命令用来读取HBase列数据并写入到SolrInputDocument对象中,该命令必须包含零个或者多个mappings命令对象。
mappings:用来指定HBase列限定符的字段映射。
inputColumn:需要写入到solr中的HBase列字段。值包含列族和列限定符,并用‘ : ’分开。其中列限定符也可以使用通配符*来表示,譬如可以使用c1:*表示读取只要列族为data的所有hbase列数据,也可以通过c1:na*来表示读取列族为c1列限定符已na开头的字段值.
outputField:用来表示morphline读取的记录需要输出的数据字段名称,该名称必须和solr中的schema.xml文件的field节点自定义的name名称保持一致,否则写入不正确
type:用来定义读取HBase数据的数据类型,HBase中的数据都是以byte[]的形式保存,但是所有的内容在Solr中索引为text形式,所以需要一个方法来把byte[]类型转换为实际的数据类型。type参数的值就是用来做这件事情的。现在支持的数据类型有: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 Configuration 和 Lily HBase Indexer Service
[root@kjtlxsvr5 conf]# hbase-indexer add-indexer \
> --name test3indexer \
> --indexer-conf $HOME/hbase-indexer/test3/morphline-hbase-mapper.xml \
> --connection-param solr.zk=192.168.60.44:2181/solr \
> --connection-param solr.collection=test3 \
> --zookeeper 192.168.60.44:2181,192.168.60.45:2181,192.168.60.46:2181
注:键入hbase-indexer回车,获取命令帮助
--name:为indexer取名,自定义
--indexer-conf 上面创建的morphline-hbase-mapper.xml文件地址
--connection-param solr.zk : solr安装所在节点的zk地址,如有zk节点上没有安装solr,这里不写节点
--connection-param solr.collection: 上面创建的solr.collection名称,要与上面一致
--zookeeper :zk节点地址
6.在hbase中插入数据
hbase(main):031:0> put 'test3','001','c1:name','xxi'
hbase(main):040:0> put 'test3','002','c1:name','li'
7.在solr中查看索引,打开地址为:solr节点ip:8983/solr,查看结果如下
全部查询:
输入查询条件查询,查询条件的格式为——》在schema.xml文件中自定义的field节点name属性:预查询的值
8.卸载索引
如果想删除索引,倒着来就可以了
①键入hbase-indexer命令,有delete-indexer和 list-indexers可使用,若忘记了刚刚自己定义的indexer名称,可使用hbase-indexer list-indexers查看,然后删除
hbase-indexer delete-indexer --name test3
②到Key-Value Store Indexer的配置页面,把Morphlines文件中相关配置删除,也可不删,等创建其他索引的时候在该基础上改,或者删除也可
③删除collection,如果忘记名称,使用solrctl collection --list查看
solrctl collection --delete test3
④删除zk上的配置文件,忘记名称,如上查看
solrctl instancedir --delete test3
⑤删除本地配置
rm -rf $HOME/hbase-indexer/test3
9.批量同步索引
①如果对一个已经存在数据的hbase表做了索引,会发现只记录了后面插入的数据,已经存在的数据没有索引。那么就要将之前的数据的索引同步上。
②运行同步命令需要在有morphlines.conf文件的目录进行。在hbase的master节点上,执行命令:
find / |grep morphlines.conf$
③进入最新的那个process目录/run/cloudera-scm-agent/process/271-ks_indexer-HBASE_INDEXER,执行命令
(如果想不进入目录执行,则在命令中加上 --morphline-file /run/cloudera-scm-agent/process/271-ks_indexer-HBASE_INDEXER/morphlines.conf,来指定目录所在位置 )
hadoop --config /etc/hadoop/conf \
jar /opt/cloudera/parcels/CDH/lib/hbase-solr/tools/hbase-indexer-mr-1.5-cdh5.11.0-job.jar \
--conf /etc/hbase/conf/hbase-site.xml \
--hbase-indexer-file $HOME/hbase-indexer/test/morphline-hbase-mapper.xml \
--zk-host 192.168.60.44:2181/solr \
--collection test \
--reducers 0 \
--go-live
注:jar:后面的jar路径需要查看所使用的cloudera安装目录下的jar包具体名字
--hbase-indexer-file :morphline-hbase-mapper.xml文件路径,如果执行命令的节点该文件不存在,则从存在的机器上复制过来即可
10.为多个列族多个列做索引
操作顺序与上面一致。需要修改的地方是:
①建表时建立多个列族
②需要做多少个索引,schema.xml中即多写几个field字段
<field name="test4name" type="string" indexed="true" stored="true" />
<field name="test4add" type="string" indexed="true" stored="true" />
③Morphline 文件如下配置:
SOLR_LOCATOR :{
# Name of solr collection
#collection : test3
# ZooKeeper ensemble
zkHost :"$ZK_HOST"
}
morphlines :[
{
id : test1Map
importCommands :["org.kitesdk.**","com.ngdata.**"]
commands :[
{
extractHBaseCells {
mappings :[
{
inputColumn :"c1:name"
outputField :"testname"
type :string
source : value
},
{
inputColumn :"c1:add"
outputField :"testadd"
type :string
source : value
}
]
}
}
{ logDebug { format :"output record: {}", args :["@{}"]}}
]
},
{
id : test2Map
importCommands :["org.kitesdk.**","com.ngdata.**"]
commands :[
{
extractHBaseCells {
mappings :[
{
inputColumn :"c1:name"
outputField :"testname"
type :string
source : value
},
{
inputColumn :"c2:add"
outputField :"testadd"
type :string
source : value
}
]
}
}
{ logDebug { format :"output record: {}", args :["@{}"]}}
]
},
{
id : test3Map
importCommands :["org.kitesdk.**","com.ngdata.**"]
commands :[
{
extractHBaseCells {
mappings :[
{
inputColumn :"c1:name"
outputField :"test3name"
type :string
source : value
}
]
}
}
{ logDebug { format :"output record: {}", args :["@{}"]}}
]
},
{
id : test4Map
importCommands :["org.kitesdk.**","com.ngdata.**"]
commands :[
{
extractHBaseCells {
mappings :[
{
inputColumn :"c1:*"
outputField :"test4name"
type :string
source : value
},
{
inputColumn :"c2:*"
outputField :"test4add"
type :string
source : value
}
]
}
}
{ logDebug { format :"output record: {}", args :["@{}"]}}
]
}
]
注:i.上面的配置中有test1Map,test2Map,test3Map,test4Map共4个Morphline 片段,以id区分,分别对应了4张表。即因为CDH中Morphline.conf文件只有一个,所以如果对多张表做索引,为了各自区分互不干扰,就这样配置即可,id就是区分的根据。
ii.上面的某一个配置片段中,有mappings节点,其中可以有若干个{}包含的子节点,每一个子节点就可以配置一列。如上test4Map,对c1,c2的所有字段做了索引,但是输出只有2个,并且列名未知,很少这用。如果写成inputColumn :"c1:a*"则是对以a开头列做索引;如果写成inputColumn :"c1:name",则是精确对c1列族的name列做索引。
11.修改,更新索引
这里分为两种情况。
①索引还未建立完成想修改配置,或者索引建立完成,还未插入数据,想修改配置。比如想修改schema.xml,增加一个field字段,如下操作
修改schema.xml
更新配置文件;
solrctl instancedir --update test4 $HOME/test4
更新collection;
solrctl collection --reload test4
如果还想更改Morphline.conf文件中指定的列族,列名等,修改后重启Key-Value Store Indexer,然后插入hbase数据即可。
②如果索引已经建立,已经有了索引数据,想要修改索引,则要先删除索引数据集,清空数据集可以通过solr API来完成,也可以在命令行中完成,键入如下命令:
首先清空该collection;
solrctl collection --deletedocs test4
按照上面的操作,修改配置;
但是现在只有新插入的数据才有索引,需要使用上面9.批量同步索引的方法,将以前的数据的索引重新创建好。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010936936/article/details/78064148