MapReduceIndexerTool - 在Solr中索引HDFS文件的最佳方法?

时间:2016-09-07 18:47:47

标签: hadoop solr hdfs cloudera lucidworks

我有一个要求,我必须将HDFS文件(包括TXT,PDF,DOCX,其他丰富文档)索引到Solr。

目前,我正在使用LucidWorks连接器的DirectoryIngestMapper来实现相同目的。 https://github.com/lucidworks/hadoop-solr

但是我无法使用它,因为它有一定的局限性(主要的是你不能指定要考虑的文件类型)。

所以现在我正在研究使用MapReduceIndexerTool的可能性。但它并没有很多初学者(我的意思是绝对基本的!)级别的例子。

有人可以发布一些带有MapReduceIndexerTool开头示例的链接吗?还有其他更好或更简单的方法来索引HDFS中的文件吗?

2 个答案:

答案 0 :(得分:2)

在Cloudera上我认为你有这些选择:

关于MapReduceIndexerTool这里有一个快速指南:

使用MapReduceIndexerTool

将csv索引到SolR

本指南介绍如何使用 MapReduceIndexerTool .csv文件索引/上传到SolR。 此过程将从HDFS读取csv并直接在HDFS中写入索引。

另见https://www.cloudera.com/documentation/enterprise/latest/topics/search_mapreduceindexertool.html

假设你有:

  • 有效的cloudera安装(请参阅THIS_IS_YOUR_CLOUDERA_HOST,如果使用Docker快速入门,则应为quickstart.cloudera
  • 存储在HDFS中的csv文件(请参阅THIS_IS_YOUR_INPUT_CSV_FILE,如/your-hdfs-dir/your-csv.csv
  • 已配置预期字段的有效目标SolR集合(请参阅THIS_IS_YOUR_DESTINATION_COLLECTION
    • 输出目录将是SolR配置instanceDir(请参阅THIS_IS_YOUR_CORE_INSTANCEDIR)并且应该是HDFS路径

对于此示例,我们将处理包含uidfirstNamelastName列的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输出目录中写入权限。
  • 默认情况下,Cloudera QuickStart具有非常小的内存和堆内存配置。 如果您收到内存不足异常或堆异常,我建议使用Cloudera Manager-&gt; Yarn-&gt; Configurations(http://THIS_IS_YOUR_CLOUDERA_HOST:7180/cmf/services/11/config#filterdisplayGroup=Resource+Management ) 我已经使用1 GB的内存和500 MB的堆用于map和reduce作业。 还要考虑更改yarn.app.mapreduce.am.command-opts
  • 中的mapreduce.map.java.optsmapreduce.map.memory.mbmapreduce.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