CDH HBASE使用Solr创建二级索引,更新删除索引

6 篇文章 0 订阅

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值