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

来源:互联网 发布:仿真软件proteus下载 编辑:程序博客网 时间:2024/05/23 00:05
关于为什么要创建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
                        注:其中-s7个分片(shard),我的solrserver集群共4个节点-r3个副本(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.批量同步索引的方法,将以前的数据的索引重新创建好。