mapreduceindexertool-在solr中索引hdfs文件的最佳方法?

xmjla07d  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(542)

我有一个要求,我必须索引hdfs文件(包括txt,pdf,docx,其他丰富的文件)到solr。
目前,我正在使用 DirectoryIngestMapper 对lucidworks连接器实现同样的功能。https://github.com/lucidworks/hadoop-solr
但是我不能使用它,因为它有一些限制(主要的限制是您不能指定要考虑的文件类型)。
所以现在我正在研究使用 MapReduceIndexerTool . 但初学者不多(我是说绝对基础!)水平示例。
有没有人可以发布一些链接,并举例说明如何使用mapreduceindexertool?有没有其他更好或更简单的方法来索引hdfs中的文件?

disho6za

disho6za1#

在cloudera上,我认为您有以下选择:
MapReduceIndexer工具
CrunchIndexer工具
自定义spark或map reduce任务,例如使用spark solr
关于mapreduceindexertool这里有一个快速指南:

使用mapreduceindexertool将csv索引到solr

本指南向您展示如何索引/上载 .csv 使用mapreduceindexertool将文件保存到solr。此过程将从hdfs读取csv,并直接在hdfs中写入索引。
另请参见https://www.cloudera.com/documentation/enterprise/latest/topics/search_mapreduceindexertool.html .
假设你有:
有效的cloudera安装(请参阅 THIS_IS_YOUR_CLOUDERA_HOST ,如果使用docker quickstart,则应 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路径
对于本例,我们将使用 uid , firstName 以及 lastName 柱。第一行包含标题。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输出目录中写入的权限。
默认情况下,clouderaquickstart具有非常小的内存和堆内存配置。如果您收到内存不足异常或堆异常,我建议使用cloudera manager->yarn->configurations来增加它(http://this_is_your_cloudera_host:7180/cmf/services/11/config#filterdisplaygroup=resource+management)我对map和reduce作业使用了1GB内存和500mb堆。同时考虑改变 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 其他资源:
http://kitesdk.org/docs/1.1.0/morphlines/morphlines-reference-guide.html#readcsv
https://github.com/kite-sdk/kite/blob/master/kite-morphlines/kite-morphlines-core/src/test/resources/test-morphlines/readcsv.conf
https://www.cloudera.com/documentation/enterprise/latest/topics/search_flume_nrt_index_ref.html#csug_topic_7
https://community.cloudera.com/t5/cloudera-search-apache-solrcloud/solr-indexing-on-hive-table/td-p/46809/page/2

fdbelqdn

fdbelqdn2#

但是我不能使用它,因为它有一些限制(主要的限制是您不能指定要考虑的文件类型)。
与https://github.com/lucidworks/hadoop-solr 输入是一条路径。
因此,可以按文件名指定。 -i /path/*.pdf 编辑:
您可以添加 add.subdirectories 争论。但是 *.pdf 不是递归设置的源 -Dadd.subdirectories=true

相关问题