我有一个要求,我必须将HDFS文件(包括TXT,PDF,DOCX,其他丰富文档)索引到Solr。
目前,我正在使用LucidWorks连接器的DirectoryIngestMapper
来实现相同目的。
https://github.com/lucidworks/hadoop-solr
但是我无法使用它,因为它有一定的局限性(主要的是你不能指定要考虑的文件类型)。
所以现在我正在研究使用MapReduceIndexerTool
的可能性。但它并没有很多初学者(我的意思是绝对基本的!)级别的例子。
有人可以发布一些带有MapReduceIndexerTool开头示例的链接吗?还有其他更好或更简单的方法来索引HDFS中的文件吗?
答案 0 :(得分:2)
在Cloudera上我认为你有这些选择:
关于MapReduceIndexerTool这里有一个快速指南:
本指南介绍如何使用 MapReduceIndexerTool 将.csv
文件索引/上传到SolR。
此过程将从HDFS读取csv并直接在HDFS中写入索引。
另见https://www.cloudera.com/documentation/enterprise/latest/topics/search_mapreduceindexertool.html。
假设你有:
THIS_IS_YOUR_CLOUDERA_HOST
,如果使用Docker快速入门,则应为quickstart.cloudera
)THIS_IS_YOUR_INPUT_CSV_FILE
,如/your-hdfs-dir/your-csv.csv
)THIS_IS_YOUR_DESTINATION_COLLECTION
)
instanceDir
(请参阅THIS_IS_YOUR_CORE_INSTANCEDIR
)并且应该是HDFS路径对于此示例,我们将处理包含uid
,firstName
和lastName
列的TAB分隔文件。第一行包含标题。 Morphlines配置文件将跳过第一行,因此实际的列名称并不重要,列只是按此顺序排列。
在SolR上,我们应该使用类似的东西配置字段:
<field name="_version_" type="long" indexed="true" stored="true" />
<field name="uid" type="string" indexed="true" stored="true" required="true" />
<field name="firstName" type="text_general" indexed="true" stored="true" />
<field name="lastName" type="text_general" indexed="true" stored="true" />
<field name="text" type="text_general" indexed="true" multiValued="true" />
然后,您应该使用以下代码创建Morphlines配置文件(csv-to-solr-morphline.conf
):
# Specify server locations in a SOLR_LOCATOR variable; used later in
# variable substitutions:
SOLR_LOCATOR : {
# Name of solr collection
collection : THIS_IS_YOUR_DESTINATION_COLLECTION
# ZooKeeper ensemble
zkHost : "THIS_IS_YOUR_CLOUDERA_HOST:2181/solr"
}
# Specify an array of one or more morphlines, each of which defines an ETL
# transformation chain. A morphline consists of one or more potentially
# nested commands. A morphline is a way to consume records such as Flume events,
# HDFS files or blocks, turn them into a stream of records, and pipe the stream
# of records through a set of easily configurable transformations on the way to
# a target application such as Solr.
morphlines : [
{
id : morphline1
importCommands : ["org.kitesdk.**"]
commands : [
{
readCSV {
separator : "\t"
# This columns should map the one configured in SolR and are expected in this position inside CSV
columns : [uid,lastName,firstName]
ignoreFirstLine : true
quoteChar : ""
commentPrefix : ""
trim : true
charset : UTF-8
}
}
# Consume the output record of the previous command and pipe another
# record downstream.
#
# This command deletes record fields that are unknown to Solr
# schema.xml.
#
# Recall that Solr throws an exception on any attempt to load a document
# that contains a field that is not specified in schema.xml.
{
sanitizeUnknownSolrFields {
# Location from which to fetch Solr schema
solrLocator : ${SOLR_LOCATOR}
}
}
# log the record at DEBUG level to SLF4J
{ logDebug { format : "output record: {}", args : ["@{}"] } }
# load the record into a Solr server or MapReduce Reducer
{
loadSolr {
solrLocator : ${SOLR_LOCATOR}
}
}
]
}
]
要导入,请在群集中运行以下命令:
hadoop jar /usr/lib/solr/contrib/mr/search-mr-*-job.jar \
org.apache.solr.hadoop.MapReduceIndexerTool \
--output-dir hdfs://quickstart.cloudera/THIS_IS_YOUR_CORE_INSTANCEDIR/ \
--morphline-file ./csv-to-solr-morphline.conf \
--zk-host quickstart.cloudera:2181/solr \
--solr-home-dir /THIS_IS_YOUR_CORE_INSTANCEDIR \
--collection THIS_IS_YOUR_DESTINATION_COLLECTION \
--go-live \
hdfs://THIS_IS_YOUR_CLOUDERA_HOST/THIS_IS_YOUR_INPUT_CSV_FILE
一些注意事项:
sudo -u hdfs
运行上述命令,因为您不应该在HDFS输出目录中写入权限。yarn.app.mapreduce.am.command-opts
mapreduce.map.java.opts
,mapreduce.map.memory.mb
,mapreduce.map.memory.mb
和/etc/hadoop/conf/map-red-sites.xml
其他资源:
答案 1 :(得分:1)
但是我无法使用它,因为它有一定的局限性(主要的是你不能指定要考虑的文件类型)。
使用https://github.com/lucidworks/hadoop-solr输入是路径。
因此,您可以按文件名指定。
-i /path/*.pdf
编辑:
您可以添加add.subdirectories
参数。但*.pdf
未递归设置gitsource
-Dadd.subdirectories=true