问题导读: 1. 整个文件处理流程是怎样的? 2. 如何在Solr中建立collection? 3. 如何对Morphline 和 Lily Indexer 进行配置? 4. 如何批量建立全文索引? 5. 如何在Solr和Hue中验证?
1.文档编写目的
上一篇文章Fayson介绍了《 如何使用HBase存储文本文件》,我们将文本文件存储到HBase中,文件名作为HBase表的Rowkey,每个文件转为二进制字节流存储到HBase表的一个column中。我们可以通过Rowkey来查询这些数据,但是我们却没办法实现这些文本文件的全文索引。这时我们就需要借助Lily HBase Indexer在Solr中建立全文索引来实现。
Lily HBase Indexer提供了快速、简单的HBase的内容检索方案,它可以帮助你在Solr中建立HBase的数据索引,从而通过Solr进行数据检索。由于索引过程是异步的,所以并不影响HBase的写负载,同时借助 SolrCloud 可实现分布式索引。本文为了简单起见,没有再搭一个Lily Indexer的集群,只是借助于Lily Indexer的功能对上一篇文章入库的21篇文章批量建立全文索引到Solr中。
1.文件处理流程 2.在Solr中建立collection 3.准备Morphline与Lily Indexer配置文件 4.开始批量建立全文索引 5.在Solr和Hue界面中查询
1.RedHat7.4 2.CM5.14.3 3.CDH5.14.2 4.集群未启用Kerberos
1.Solr服务已经安装并运行正常 2.Hue中已经配置集成Solr服务 3.已经将非结构化文本文件保存到HBase
2.文件处理流程
1.如上图所示,CDH提供了批量和准实时两种基于HBase的数据在Solr中建立索引的方案和自动化工具,避免你开发代码。本文后面描述的实操内容是基于图中上半部分的批量建立索引的方式。
3.在Solr中建立collection,这里需要定义一个schema文件对应到HBase的表结构。
4.修改Morphline的配置文件,使用Morphline解析HBase表数据的功能。
5.另外还需要定义一个Lily Indexer的配置文件,对应到HBase的表以及Morphline文件。
6.然后启动Morphline作业,是一个MapReduce任务,它会首先读取存在HBase中的原始文件,然后开始创建Solr的全文索引,最终把索引也会保存到HDFS。
3.在Solr中建立collection
1.准备建立Solr collection的schema文件,主要是content列对应到HBase中存储的column内容。 [mw_shl_code=bash,true][root@ip-172-31-8-230 conf]# cat schema.xml
<?xml version="1.0" encoding="UTF-8" ?>
<schema name="example" version="1.5">
<fields>
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false"/>
<field name="_version_" type="long" indexed="true" stored="true"/>
<field name="content" type="text_ch" indexed="true" stored="true"/>
</fields>
<uniqueKey>id</uniqueKey>
<types>
<fieldType name="string" class="solr.StrField" sortMissingLast="true"/>
<fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="text_ch" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.SmartChineseSentenceTokenizerFactory"/>
<filter class="solr.SmartChineseWordTokenFilterFactory"/>
</analyzer>
</fieldType>
</types>
</schema>[/mw_shl_code]
注意Solr在建立全文索引的过程中,必须指定唯一键(uniqueKey),类似主键,唯一确定一行数据,我们这里的示例使用的是HBase中的Rowkey。如果没有,你可以让solr自动生成。
schema文件中的字段类型定义,标准如int,string,long等这里不再说明,注意有两个类型text_cn,text_ch,主要对应到英文或者中文的文字内容,涉及到分词和全文检索技术。英文的分词和全文检索是默认自带的,中文的这里使用了一个开源的Solr的中文分词包lucene-analyzers-smartcn。下载地址为: https://repository.cloudera.com/artifactory/cdh-releases-rcs/org/apache/lucene/lucene-analyzers-smartcn/4.10.3-cdh5.14.2/
2.准备建立collection的脚本
[mw_shl_code=bash,true]ZK="ip-172-31-5-171.ap-southeast-1.compute.internal"
COLLECTION="collection1"
BASE=`pwd`
SHARD=3
REPLICA=1
echo "create solr collection"
rm -rf tmp/*
solrctl --zk $ZK:2181/solr instancedir --generate tmp/${COLLECTION}_configs
cp conf/schema.xml tmp/${COLLECTION}_configs/conf/
solrctl --zk $ZK:2181/solr instancedir --create $COLLECTION tmp/${COLLECTION}_configs
solrctl --zk $ZK:2181/solr collection --create $COLLECTION -s $SHARD -r $REPLICA
solrctl --zk $ZK:2181/solr collection --list[/mw_shl_code]
ZK:Zookeeper的某台机器的hostname COLLECTION:需要建立的collection名字 SHARD:需要建立的shard的数量 REPLICA:副本数
3.执行create.sh建立collection
[mw_shl_code=bash,true][root@ip-172-31-8-230 solr-hbase]# sh create.sh
create solr collection
Uploading configs from tmp/collection1_configs/conf to ip-172-31-5-171.ap-southeast-1.compute.internal:2181/solr. This may take up to a minute.
collection1 (2)[/mw_shl_code]
4.准备Morphline与Lily Indexer配置文件
1.准备Morphline的配置文件
[mw_shl_code=bash,true]morphlines : [
{
id : morphline1
importCommands : ["org.kitesdk.morphline.**", "com.ngdata.**"]
commands : [
{
extractHBaseCells {
mappings : [
{
inputColumn : "textinfo:content"
outputField : "content"
type : "string"
source : value
}]
}
}
]
}
][/mw_shl_code]
3.准备Lily Indexer的配置文件
[mw_shl_code=bash,true]<?xml version="1.0"?>
<indexer table="TextHbase" mapper="com.ngdata.hbaseindexer.morphline.MorphlineResultToSolrMapper" mapping-type="row" >
<!-- 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="/root/solr-hbase/conf/morphlines.conf"/>
<!-- The optional morphlineId identifies a morphline if there are multiple morphlines in morphlines.conf -->
<!-- <param name="morphlineId" value="morphline1"/> -->
</indexer>[/mw_shl_code]
5.开始批量建立全文索引
1.将中文分词包拷贝到指定的目录,首先到以下网址下载中文分词的jar包
https://repository.cloudera.com/artifactory/cdh-releases-rcs/org/apache/lucene/lucene-analyzers-smartcn/4.10.3-cdh5.14.2/
将中文分词jar包分发到所有机器的Solr和YARN服务相关的目录 [mw_shl_code=bash,true]
[root@ip-172-31-8-230 solr-hdfs]# cp lucene-analyzers-smartcn-4.10.3-cdh5.14.2.jar /opt/cloudera/parcels/CDH/lib/hadoop-yarn
[root@ip-172-31-8-230 solr-hdfs]# cp lucene-analyzers-smartcn-4.10.3-cdh5.14.2.jar /opt/cloudera/parcels/CDH/lib/solr/webapps/solr/WEB-INF/lib[/mw_shl_code]
2.分发到集群所有机器
[mw_shl_code=bash,true][root@ip-172-31-8-230 shell]# sh bk_cp.sh node.list /opt/cloudera/parcels/CDH/lib/hadoop-yarn/lucene-analyzers-smartcn-4.10.3-cdh5.14.2.jar /opt/cloudera/parcels/CDH/lib/hadoop-yarn
lucene-analyzers-smartcn-4.10.3-cdh5.14.2.jar
[root@ip-172-31-8-230 shell]# sh bk_cp.sh node.list /opt/cloudera/parcels/CDH/lib/solr/webapps/solr/WEB-INF/lib/lucene-analyzers-smartcn-4.10.3-cdh5.14.2.jar /opt/cloudera/parcels/CDH/lib/solr/webapps/solr/WEB-INF/lib[/mw_shl_code]
3.准备建立索引的脚本文件
[mw_shl_code=bash,true]COLLECTION='collection1'
ZK='ip-172-31-5-38.ap-southeast-1.compute.internal'
echo 'Delete previous docs...'
solrctl collection --deletedocs $COLLECTION
echo 'Lily HBase MapReduce indexing...'
config="/etc/hadoop/conf.cloudera.yarn"
parcel="/opt/cloudera/parcels/CDH"
jar="$parcel/lib/hbase-solr/tools/hbase-indexer-mr-*-job.jar"
hbase_conf="/etc/hbase/conf/hbase-site.xml"
opts="'mapred.child.java.opts=-Xmx1024m'"
log4j="$parcel/share/doc/search*/examples/solr-nrt/log4j.properties"
zk="$ZK:2181/solr"
libjars="lib/lucene-analyzers-smartcn-4.10.3-cdh5.14.2.jar"
export HADOOP_OPTS="-Djava.security.auth.login.config=conf/jaas.conf"
hadoop --config $config jar $jar --conf $hbase_conf --libjars $libjars -D $opts --log4j $log4j --hbase-indexer-file conf/indexer-config.xml --verbose --go-live --zk-host $zk --collection $COLLECTION[/mw_shl_code]
4.运行脚本开始建立索引
[mw_shl_code=bash,true][root@ip-172-31-8-230 solr-hbase]#
[root@ip-172-31-8-230 solr-hbase]# sh batch.sh
Delete previous docs...
Lily HBase MapReduce indexing...
0 [main] INFO org.apache.solr.common.cloud.SolrZkClient - Using default ZkCredentialsProvider
21 [main] INFO org.apache.solr.common.cloud.ConnectionManager - Waiting for client to connect to ZooKeeper
25 [main-SendThread(ip-172-31-5-38.ap-southeast-1.compute.internal:2181)] WARN org.apache.zookeeper.ClientCnxn - SASL configuration failed: javax.security.auth.login.LoginException: Zookeeper client cannot authenticate using the 'Client' section of the supplied JAAS configuration: 'conf/jaas.conf' because of a RuntimeException: java.lang.SecurityException: java.io.IOException: conf/jaas.conf (No such file or directory) Will continue connection to Zookeeper server without SASL authentication, if Zookeeper server allows it.[/mw_shl_code]
索引建立成功
5.在YARN的8088上也能看到MapReduce任务。
6.在Solr和Hue界面中查询
1.在Solr的界面中进行查询,一共21条记录,对应到21个文件,符合预期。
2.查询“英国”关键字,结果为7条,符合预期。
3.在Hue中进行查询,总条数为21符合预期。
4.查询关键字“英国”,为7条,符合预期。
7.总结
1.使用Lily Indexer可以很方便的对HBase中的数据在Solr中进行索引,包含HBase的二级索引,以及非结构化文本数据的全文索引。
2.使用Cloudera提供的Morphline工具,可以让你不需要编写一行代码,只需要通过使用一些配置文件就可以快速的对半/非机构化数据进行全文索引。
3.本文demo提供的中文分词是比较弱的,要想真正上生产使用,可以考虑使用更好的开源中文分词包或者其他第三方的。
4.注意如果全文索引的字段有需要做中文分词的,需要将中文分词的jar包上传到所有机器的Solr和YARN服务相关的目录。否则Solr会无法创建collection,YARN也无法启动创建索引的MapReduce任务。
本文所有代码或脚本源码已上传到github,参考: https://github.com/fayson/cdhproject/tree/master/hbasedemo/solr-hbase
来源:https://mp.weixin.qq.com/s?__biz ... Eb093AtJuEx2eXO5#rd
作者:Fayson
|