Solr over HDFS
操作场景
Solr支持将HDFS中的数据批量导入Solr中,建立索引。用户可以通过shell命令,启动批量导入任务。
目前支持的数据格式有csv、xml、eml、html、txt、doc、pdf、xls、xlsx、jpg、png、tif等。
前提条件
- 已成功安装HDFS、Solr、Yarn服务,且Manager页面内Solr服务的服务配置参数“INDEX_STORED_ON_HDFS”为“TRUE”,“SOLR_INDEX_LOCAL_STORAGE_DIR”参数值为空。
- Solr over HDFS的源数据需要保存在HDFS中,不支持本地盘中的数据。
- 若集群是普通模式,请关闭HDFS鉴权,避免权限不足问题。登录Manager。选择“集群 > 待操作集群的名称 > 服务 > HDFS > 配置”。单击“全部配置”。搜索参数“dfs.namenode.acls.enabled”和“dfs.permissions.enabled”。
- “dfs.namenode.acls.enabled”表示是否启用HDFS ACL,默认为“true”启用ACL,请修改为“false”。
- “dfs.permissions.enabled”表示是否为HDFS启用权限检查,默认为“true”启用权限检查,请修改为“false”。修改后HDFS中的目录和文件的属主、属组以及权限信息保持不变。
单击“保存”,单击“确定”。等待界面提示操作完成,关闭HDFS鉴权。
准备工作
- 已安装Solr、HDFS、Yarn的客户端,例如安装路径为“/opt/client”。
- 拷贝xml配置文件。切换到Yarn客户端安装目录,将“/opt/client/Yarn/config/”目录下core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml文件拷贝到Solr客户端的“/opt/client/Solr/hdfs-indxer/conf”目录下。xml文件是访问HDFS和MapReduce必用的工具配置文件。
- 进入客户端安装目录,执行source bigdata_env导入环境变量。
- 执行如下命令,验证MapReduceIndexerTool的正确性。
hdfs-indexer --help
如下结果表示依赖包配置OK,MapReduceIndexerTool可以开始正常使用。
FI02XB:/opt/client # hdfs-indexer --config /opt/client/Solr/hdfs-indexer/conf jar /opt/client/Solr/lib/solr-map-reduce-*.jar -libjars "$SOLR_HADOOP_LIBJAR" -- help WARNING: Use "yarn jar" to launch YARN applications. SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/opt/client/HDFS/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/opt/client/Solr/hbase-indexer/lib/slf4j-log4j12-1.7.6.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory] usage: hadoop [GenericOptions]... jar solr-map-reduce-*.jar [--help] --output-dir HDFS_URI [--input-list URI] --morphline-file FILE [--morphline-id STRING] [--update-conflict-resolver FQCN] [--mappers INTEGER] [--reducers INTEGER] [--max-segments INTEGER] [--fair-scheduler-pool STRING] [--dry-run] [--log4j FILE] [--verbose] [--show-non-solr-cloud] [--zk-host STRING] [--go-live] [--collection STRING] [--go-live-threads INTEGER] [HDFS_URI [HDFS_URI ...]] MapReduce batch job driver that takes a morphline and creates a set of Solr index shards from a set of input files and writes the indexes into HDFS, in a flexible, scalable and fault-tolerant manner. It also supports merging the output shards into a set of live customer facing Solr servers, typically a SolrCloud. The program proceeds in several consecutive MapReduce based phases, as follows:
操作步骤
根据HDFS存储的数据格式不同,需要配置对应的morphlines配置文件(如下文的“ReadCSVContainer.conf”文件),本章节以csv文件为例进行说明,更多完整和详细的配置文件请参考http://kitesdk.org/docs/1.1.0/morphlines/morphlines-reference-guide.html和https://github.com/kite-sdk/kite/tree/master/kite-morphlines/kite-morphlines-core/src/test/resources。
- 执行以下命令进入客户端安装目录。
cd /opt/client
- 执行以下命令配置环境变量。
source bigdata_env
- 是否安装了多个Solr服务。
- 是,使用客户端连接某个具体Solr服务时,请执行命令加载该具体服务的环境变量。例如,执行以下命令加载Solr-1服务变量:source Solr-1/component_env
- 否,跳过此步骤。
- 如果集群为安全模式,执行以下命令进行用户认证。普通模式集群无需执行用户认证。
kinit solr
- 执行命令,下载Solr的默认配置集到本地。
solrctl confset --get confWithHDFS /opt/client/Solr/hdfs-indexer/config-csv/
- 进入下载Solr默认配置集到本地的目录“Solr/hdfs-indexer/config-csv/”,根据实际的数据所需要的字段修改配置文件“managed-schema”,执行vi conf/managed-schema。
例如为filedA~fieldG建立索引,修改“managed-schema”配置文件如下:
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> <field name="timestamp" type="tlong" indexed="true" stored="true" multiValued="false" docValues="true" /> <field name="fieldA" type="text_ngram" indexed="true" stored="true" multiValued="false" /> <field name="fieldB" type="text_ngram" indexed="true" stored="true" multiValued="false" /> <field name="fieldC" type="text_ngram" indexed="true" stored="true" multiValued="false" /> <field name="fieldD" type="text_ngram" indexed="true" stored="true" multiValued="false" /> <field name="fieldE" type="text_ngram" indexed="true" stored="true" multiValued="false" /> <field name="fieldF" type="text_ngram" indexed="true" stored="true" multiValued="false" /> <field name="fieldG" type="text_ngram" indexed="true" stored="true" multiValued="false" /> <fieldType name="text_ngram" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="2"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="2"/> </analyzer> </fieldType>
在客户端安装目录的“Solr/hdfs-indexer/m-conf/conf-model-Forcsv”内有managed-schema样例,可以参照进行增改。
- 修改完成配置之后,上传配置集到ZooKeeper。
solrctl confset --create conf_test_100 /opt/client/Solr/hdfs-indexer/config-csv/
- 利用上传的配置集创建collection。
solrctl collection --create collection_hdfs_100 -s 3 -c conf_test_100 -r 1 -m 10 -S true
- 将需要建立索引的数据上传HDFS的指定目录之下,具体操作请参考使用HDFS章节,例如:
hdfs dfs -put /opt/client/Solr/hdfs-indexer/m-conf/conf-model-Forcsv/testfile-csv.txt hdfs://hacluster/user/solr/testfile-csv.txt
在客户端安装目录的“Solr/hdfs-indexer/m-conf/conf-model-Forcsv”内有csv样例文件。
- 修改/opt/client/Solr/hdfs-indexer/m-conf/conf-model-Forcsv/ReadCSVContainer.conf配置文件中的“collection”和“zkHost”为实际的collection名称和zkHost值,文件格式如下:
SOLR_LOCATOR : { collection : collection_hdfs_100 // 修改为实际的collection名称 zkHost : "192.168.1.1:2181,192.168.1.2:2181, 192.168.1.3:2181/solr" // 修改为实际集群的zkHost值,可根据Solr Dashboard查看。 batchSize : 10000 } morphlines : [ { id : pretest importCommands : ["org.kitesdk.**", "org.apache.solr.**"] commands : [ { readCSV { separator : ";" columns : [timestamp,fieldA,fieldB,fieldC,fieldD,fieldE,fieldF,fieldG] quoteChar : "\"" charset : UTF-8 } } { generateUUID { field : id } } { sanitizeUnknownSolrFields { solrLocator : ${SOLR_LOCATOR} } } { logDebug { format : "output record: {}", args : ["@{}"] } } { loadSolr { solrLocator : ${SOLR_LOCATOR} } } ] } ]
表1 配置文件ReadCSVContainer.conf说明 参数名
说明
SOLR_LOCATOR内
collection
Solr中创建好的collection名
zkHost
ZooKeeper信息
batchSize
单次提交到Solr建立索引的数量
Morphlines内
id
自定义标识
importCommands
引用到的类
separator
每一列的分隔符
columns
每一列对应的collection中的field
quoteChar
文档内容的分割符以及文档起始行的标识
charset
编码格式
generateUUID
对应collection的uniqueKey
logDebug
日志输出格式
CSV文件样例如下:
1120420594561;SnVIeDqGwtAptrVzmbfQLCmde2BsDFISCG4;PwWbFHlTkeEUduwElwWZap01g;75U7OAQyy2JPMNmXWwe9SpGw;aphcCkOqA3iwRAu0QMrrEf6rLcdMqjL;s9C5R1pmHofdN1XOAr9NJ;oGO3z9A6sNSusRlxXfuaUDCH7P5cptIIo;sKe84RHByT3vYww73tY04szq91DKlh3s1o9 1107591105847;HPp2JjFCFQ6BRxWFM17Iqye8Hl;xHxV249tLJ5Pl3HCcbYAPxe9RWh;qJb8esxvlAM06TZI5egmxECfMJD;Bp5OBAPT8GZufPOhuHY6LVb;uUKRJG7EGBh8SrvYzmXjjWdf97Thk2CPRAkORd;OVWhxibc47RblUx9vj6VkZAsz18kuBnNYIoPnlN;TjVBIv6FqRVKzeuwYmInxeFiM
样例包含两条数据,每条数据以分号分隔字段,分别对应上述timestamp、fieldA、fieldB、fieldC、fieldD、fieldE、fieldF、fieldG各字段。
- 使用如下命令启动索引任务。
nohup hdfs-indexer --morphline-file /opt/client/Solr/hdfs-indexer/m-conf/conf-model-Forcsv/ReadCSVContainer.conf --collection collection_hdfs_100 --go-live $HDFS_URI &
在批量索引执行时,不要重复执行索引任务,这是因为批量索引为了提高效率采用了Merge index文件的方式建立索引,该方式不会逐条解析数据的Unique ID,所以当有重复数据导入时,会导致索引数据的重复,同一条索引在底层会被存储两次甚至多次,此时在Solr端进行查询,可以看有多条索引的数量显示,但是由于每个索引id重复,根据这个id去检索时,Solr找到一个id对应的索引即返回结果。导致查询到的数据又是唯一的,造成数据的紊乱,重复索引冲突相关可以参阅https://wiki.apache.org/solr/MergingSolrIndexes。
建议批量索引时,每次选用一个新的collection,这样,在索引任务执行失败后,可以选择直接删掉collection的方式进行回退清除数据。
注意:配置文件ReadCSVContainer.conf中,collection和zkHost参数确认和实际环境保持一致;索引命令中HDFS_URI修改为对应HDFS实际目录。该批量索引不支持collection为implicit路由方式。
表2 Solr over HDFS索引命令参数说明 参数
参数说明
--config
索引任务使用的配置文件所在目录,默认“${SOLR_HOME}/hdfs-indexer/conf”,用户也可以单独指定。
jar
索引任务使用的jar路径,默认“${SOLR_HOME}/lib/solr-map-reduce-${VERSION}.jar”,用户也可以单独指定。
--libjars
依赖jar的路径,默认“${SOLR_HADOOP_LIBJAR}”,用户也可以单独指定。
--morphline-file
morphline配置文件路径,必须由用户指定。
--output-dir
生成的索引输出路径,默认hdfs://hacluster/tmp/solr,用户也可以单独指定。
--http-socket-timeout
该参数用于在分片GoLive阶段时设置HTTP Socket Timeout,默认值为120000,单位为ms。在数据量较大时建议调大此参数以避免Socket超时。
--mappers
索引任务的mapper个数,默认-1,用户也可以单独指定。
--reducers
索引任务的reducer个数,默认-1,用户也可以单独指定。
--zk-host
Solr在zookeeper中的路径,默认本集群zk-host,用户也可以单独指定。
--collection
Solr的collection名,必须由用户指定。
--go-live
表示是否合并索引数据到Solr集群,不指定本参数则无法在Solr中查到建立的索引。
HDFS_URI
需要建立索引的原数据文件在HDFS上的路径,例如:hdfs://hacluster/user/solr/testfile-csv.txt,必须由用户指定。
索引任务进度和日志可以在Yarn服务内进行查询,可参考使用Yarn相关章节。
以上操作适用于简单测试环境参考,在实际生产环境还需要对相应硬件环境和组件配置进行调优。