Solr over HBase
操作场景
HBaseIndexer主要功能有批量索引、增量索引和实时索引。其中批量索引、增量索引都是通过创建MapReduce任务,将导入HBase内的数据,在Solr中建立索引。不同的是批量索引是基于scan方式,每次执行批量索引时,会将全表数据全部扫描一遍,增量索引则是基于rowkey列表的方式。使用增量索引需要Loader(或者BulkLoader)配合,将rowkey列表保存到HDFS指定目录下,执行增量索引时,只扫描新增或更新的数据,效率相比批量索引更高一些。实时索引则是基于HBase的replication机制,在数据导入HBase的同时,在Solr内建立索引,但是效率相比批量索引、增量索引会差一些。
在HBase内已有大量数据的情况下只能选择批量索引,增量索引方式进行同步。
相关命令请参考Shell客户端操作命令。
Solr在安全模式下需要进行权限管理,请参考Solr用户权限配置管理。
- HBaseIndexer的主要功能是为存储在HBase表的数据建立索引,HBase是作为原始数据的存储端,Solr是作为索引数据的存储端,故对于需要建立索引的HBase列,不推荐把列的原始值也存储在Solr端。如果HBase列的原始值要存在Solr,建议插入数据的时候,一次性把一个rowkey对应的所有列值都插入HBase表,不然会存在有些列值在Solr存储不了的情况。
- 实时索引场景下,推荐使用统一检索特性;具体操作请参考支持HBase全文索引。
- 在hbase-indexer操作中,默认的solr用户具有所有管理权限,其他用户只具有读权限(list-indexers操作)。
前提条件
- 已成功安装HDFS、Solr、Yarn、HBase服务,且Manager页面内Solr服务的服务配置参数“INDEX_STORED_ON_HDFS”为“TRUE”,“SOLR_INDEX_LOCAL_STORAGE_DIR”参数值为空。
- 已确认Solr客户端配置文件“hbase-site.xml”中“hbase.rpc.protection”参数值与HBase服务端“hbase.rpc.protection”参数值一致。否则,请重新下载客户端或手动更新该值与HBase服务端“hbase.rpc.protection”参数值保持一致。如果不一致将导致hbase-indexer索引任务失败。
操作步骤
- 以root用户登录Solr客户端安装节点。
- 下载Solr、HDFS、Yarn、HBase的客户端,安装到指定目录,例如“/opt/client”。
- 执行以下命令进入客户端安装目录。
cd /opt/client
- 执行以下命令配置环境变量。
source bigdata_env
- 是否安装了多个Solr服务。
- 是,使用客户端连接某个具体Solr服务时,请执行命令加载该具体服务的环境变量。例如,执行以下命令加载Solr-1服务变量:source Solr-1/component_env
- 否,跳过此步骤。
- 如果集群为安全模式,执行以下命令进行用户认证。普通模式集群无需执行用户认证。
kinit solr
- 创建HBaseIndexer所需配置文件,进入客户端安装目录“Solr/hbase-indexer/conf”,执行vi user.xml,创建文件“user.xml”:
<?xml version="1.0"?> <indexer table="indexdemo" mapping-type="row" read-row="never"> <field name="firstname_s" value="info:firstname"/> <field name="lastname_s" value="info:lastname"/> <field name="age_i" value="info:age"/> <param name="zookeeper.znode.parent" value="/hbase"/> </indexer>
- 创建HBase table:
$ hbase shell hbase> create 'indexdemo', { NAME => 'info',REPLICATION_SCOPE => '1' }
此处设置table属性REPLICATION_SCOPE => '1'仅对实时索引有效,不影响批量索引和增量索引,使用实时索引时必须设置;同时需要建立索引的列都必须在对应的列簇内,不支持独立的列。
- 根据配置文件中定义字段向HBase table中添加数据。
$ hbase shell hbase>put 'indexdemo','zhangsan','info:firstname','zhang' hbase>put 'indexdemo','zhangsan','info:lastname','san' hbase>put 'indexdemo','zhangsan','info:age','26' hbase>quit
- 创建Solr collection。
例如:
solrctl collection --create coll-indexdemo -c confWithSchema -s 3 -r 1
具体操作请参考Shell客户端操作命令。
- 创建Indexer。
例如执行以下命令创建名为userindexer的indexer:
hbase-indexer add-indexer -n userindexer -c /opt/client/Solr/hbase-indexer/conf/user.xml -cp solr.zk=192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181/solr -cp solr.collection=coll-indexdemo -cp solr.http.socket.timeout=120000
使用时请将coll-indexdemo替换为实际目标索引collection的名称。HTTP请求等待时间的默认值为120000,单位为毫秒,用户可通过solr.http.socket.timeout来修改。
对于创建好的indexer可以执行以下命令进行查看:
hbase-indexer list-indexers
使用批量索引、增量索引和实时索引之前都必须创建好相应的indexer。
- 开始索引任务:
- 使用HBase多服务时,执行批量索引和增量索引的命令必须增加参数“--hbase-indexer-file”,例如:--hbase-indexer-file /opt/client/Solr/hbase-indexer/conf/user.xml,配置文件中必须有param参数,格式参考7,用来指明该indexer所对应的table具体属于哪个HBase实例,否则将按照HBaseIndexer默认的HBase实例执行索引任务,不使用HBase多服务可不添加此参数。
- 在多服务模式下,开启索引任务前,请务必保证Solr服务和相关联的HBase服务共用同一套ZooKeeper,否则可能报出“Failed to get cluster ID”的异常信息。
- 当索引任务的数据量较大时,可能发生SocketTimeoutException异常,用户可在启动索引任务时配置参数“--http-socket-timeout”,单位为ms。例如--http-socket-timeout 600000。若不指定该参数,其默认值为120000。
- 批量索引。
HBase上已有大量数据,需要在solr上建立索引,执行命令:
hbase-indexer batch-indexer --hbase-indexer-zk 192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181 --hbase-indexer-name userindexer --output-dir hdfs://hacluster/tmp/solr --go-live --overwrite-output-dir -v --reducers 3 --zk-host 192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181/solr
在批量索引执行时,不要重复执行索引任务。这是因为批量索引为了提交效率采用了Merge index文件的方式建立索引,该方式不会逐条解析数据的Unique ID,所以当有重复数据导入时,会导致索引数据的重复,同一条索引在底层会被存储两次甚至多次。此时在Solr端进行查询,可以看有多条索引的数量显示,但是由于每个索引id重复,根据这个id去检索时,Solr找到一个id对应的索引即返回结果。导致查询到的数据又是唯一的,造成数据的紊乱,重复索引冲突相关可以参阅https://wiki.apache.org/solr/MergingSolrIndexes。
在批量索引任务执行失败后,建议删掉进行批量索引的collection,重新创建collection再进行批量导入。
注意:该批量索引不支持collection为implicit路由方式。
- 增量索引。
使用Loader增量导入HBase,其中存储类型选择为“HBASE_BULKLOAD”,rowkey以文件形式存放在HDFS中,用户要修改Loader的配置项“record.hbase.rowkey”的值为“true”,指定保存rowkey,同时查看“hbase.rowkey.output.path”路径,Loader用法参考使用Loader章节,执行命令:
hbase-indexer batch-indexer --hbase-indexer-zk 192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181 --hbase-indexer-name userindexer --output-dir hdfs://hacluster/tmp/solr --go-live --overwrite-output-dir -v --reducers 1 --zk-host 192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181/solr --rowkey-dir hdfs://hacluster/user/loader/hbase/rowkey/output/HBase_table/job_xxx
- “hdfs://hacluster/user/loader/hbase/rowkey/output”为rowkey的存储路径。具体可以使用HDFS命令查看,hadoop fs -ls /user/loader/hbase/rowkey/output,HDFS命令详细用法参考使用HDFS相关章节。
- HBase_table为HBase表名。若用户在HBase中使用了自定义的命名空间,比如namespace:HBase_table表,由于HDFS不支持以冒号的形式创建目录,Loader往生成的HDFS目录时会将冒号替换成井号,则rowkey的存储路径格式应为:hdfs://hacluster/user/loader/hbase/rowkey/output/namespace#HBase_table/job_xxx
- job_xxx为该表最近一次执行索引任务的job名,可在Yarn的Web UI界面查看。
- 实时索引。
保证列簇的REPLICATION_SCOPE值为1,且数据在HBase端的提交方式为putlist(导入方式不限,可以使用工具或编写HBase client程序进行导入),同时保证collection的配置集中的managed-schema里面需要建索引的Field,其属性indexed必须为true,修改collection的配置集中solrconfig.xml里面的“autoSoftCommit”配置项,保证数据在Solr内建立索引之后可以实时搜索,根据需要调整提交时间,设置过小会影响索引的效率,以上配置完成,向HBase导入数据,在Solr页面查看是否建立了对应的索引。同时,可以使用hbase-indexer replication-status命令查看当前HBase replication进度信息,详细用法参考Shell客户端操作命令。
- 选择“集群 > 服务 > Solr”,确认Solr的实例全部正常工作。单击“Solr WebUI”的“SolrServerAdmin”(两个任选一个),进入Solr Admin页面后,单击“Collection Selector”,选择“coll-indexdemo”,执行查询命令可以看到从HBase表索引到Solr collection中的数据。
- 删除Indexers。
不需要使用HBaseIndexer的功能时,需要将indexer及时删除,如果需要清理HBase和Solr上的数据,也需要先删除indexer,再操作HBase和Solr。